Date: Fri, 15 May 2020 22:00:03 +0000 From: Dave Baukus <daveb@spectralogic.com> To: "freebsd-fs@freebsd.org" <freebsd-fs@freebsd.org> Subject: zpool status Message-ID: <a89c8424-6077-dbff-7c74-a3c3c1e5310e@spectralogic.com>
index | next in thread | raw e-mail
Formerly, zpool status -v <pool> would place a "resilvering" tag in the status.
For example:
# zpool status -v Test
pool: Test
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Tue May 12 16:29:56 2020
92.8G scanned out of 295G at 292M/s, 0h11m to go
46.1G resilvered, 31.50% done
config:
NAME STATE READ WRITE CKSUM
Test DEGRADED 0 0 0
mirror-0 ONLINE 0 0 0
da5 ONLINE 0 0 0
da3 ONLINE 0 0 0
mirror-1 DEGRADED 0 0 0
da6 ONLINE 0 0 0
spare-1 REMOVED 0 0 0
12757033556734836956 REMOVED 0 0 0 was /dev/da8
da9 ONLINE 0 0 0 (resilvering)
spares
4617773861959656281 INUSE was /dev/da9
errors: No known data errors
The code in zpool is:
print_status_config() {
...
...
...
(void) nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_SCAN_STATS,
(uint64_t **)&ps, &c);
if (ps != NULL && ps->pss_state == DSS_SCANNING &&
vs->vs_scan_processed != 0 && children == 0) {
(void) printf(gettext(" (%s)"),
(ps->pss_func == POOL_SCAN_RESILVER) ?
"resilvering" : "repairing");
}
I believe the above code is now dead because this change made it a no-op:
MFV r331695, 331700: 9166 zfs storage pool checkpoint
illumos/illumos-gate@8671400134a11c848244896ca51a7db4d0f69da4
The above change introduced this function:
root_vdev_actions_getprogress(vdev_t *vd, nvlist_t *nvl)
{
spa_t *spa = vd->vdev_spa;
if (vd != spa->spa_root_vdev)
return;
/* provide either current or previous scan information */
pool_scan_stat_t ps;
if (spa_scan_get_stats(spa, &ps) == 0) {
fnvlist_add_uint64_array(nvl,
ZPOOL_CONFIG_SCAN_STATS, (uint64_t *)&ps,
sizeof (pool_scan_stat_t) / sizeof (uint64_t));
}
...
}
As one can see, we now only get ZPOOL_CONFIG_SCAN_STATS for the root vdev, thus the nvlist for a child resilvering vdev never gets tagged by zpool. Before root_vdev_actions_getprogress() was introduced, the code always retrieved ZPOOL_CONFIG_SCAN_STATS
My quick fix would be to move the root vdev check to after spa_scan_get_stats().
Or remove the dead code in zpool_main.c
--
Dave Baukus
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?a89c8424-6077-dbff-7c74-a3c3c1e5310e>
