]> granicus.if.org Git - zfs/commitdiff
Fix estimated scrub completion time
authorTom Caputi <tcaputi@datto.com>
Thu, 2 May 2019 00:34:24 +0000 (20:34 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 2 May 2019 00:34:24 +0000 (17:34 -0700)
Currently, it is possible for the 'zpool scrub' command to
progress slightly beyond 100% due to concurrent changes
happening on the live pool. This behavior is expected, but
the userspace code for 'zpool status' would subtract the
expected amount of data from the amount of data already
scrubbed, resulting in a negative integer being casted to a
large positive one. This number was then used to calculate
the estimated completion time, resulting in wildly wrong
results. This code changes the behavior so that 'zpool status'
does not attempt to report an estimate during this period.

Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Igor Kozhukhov <igor@dilos.org>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #8611
Closes #8687

cmd/zpool/zpool_main.c
man/man8/zpool.8

index c167324ce820ba057706557f26c68f7fbbf7fa4a..32c94d7db74d59bc5ab6258fe3265a01edac9c51 100644 (file)
@@ -7011,7 +7011,7 @@ print_scan_status(pool_scan_stat_t *ps)
 
        scan_rate = pass_scanned / elapsed;
        issue_rate = pass_issued / elapsed;
-       total_secs_left = (issue_rate != 0) ?
+       total_secs_left = (issue_rate != 0 && total >= issued) ?
            ((total - issued) / issue_rate) : UINT64_MAX;
 
        days_left = total_secs_left / 60 / 60 / 24;
@@ -7045,7 +7045,8 @@ print_scan_status(pool_scan_stat_t *ps)
        }
 
        if (pause == 0) {
-               if (issue_rate >= 10 * 1024 * 1024) {
+               if (total_secs_left != UINT64_MAX &&
+                   issue_rate >= 10 * 1024 * 1024) {
                        (void) printf(gettext(", %llu days "
                            "%02llu:%02llu:%02llu to go\n"),
                            (u_longlong_t)days_left, (u_longlong_t)hours_left,
index 76bc1cf74530fbc15eac53376193757025786212..eb93d3bb37bae595604f1fa7f3dfdc31dd9ee14a 100644 (file)
@@ -2189,6 +2189,10 @@ If a scrub is paused, the
 resumes it.
 If a resilver is in progress, ZFS does not allow a scrub to be started until the
 resilver completes.
+.Pp
+Note that, due to changes in pool data on a live system, it is possible for
+scrubs to progress slightly beyond 100% completion. During this period, no
+completion time estimate will be provided.
 .Bl -tag -width Ds
 .It Fl s
 Stop scrubbing.