Disabled resilver_defer feature leads to looping resilvers

When a disk is replaced with another on a pool with the resilver_defer
feature present, but not enabled the resilver activity restarts during
each spa_sync. This patch checks to make sure that the resilver_defer
feature is first enabled before requesting a deferred resilver.

This was originally fixed in illumos-joyent as OS-7982.

Reviewed-by: Chris Dunlop <chris@onthe.net.au>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tom Caputi <tcaputi@datto.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Signed-off-by: Kody A Kantor <kody@kkantor.com>
External-issue: illumos-joyent OS-7982
Closes #9299 
Closes #9338
This commit is contained in:
Kody A Kantor 2019-09-22 17:25:39 -05:00 committed by Brian Behlendorf
parent afc8f0a6ff
commit d49d7336dd

View File

@ -23,7 +23,7 @@
* Copyright (c) 2011, 2018 by Delphix. All rights reserved. * Copyright (c) 2011, 2018 by Delphix. All rights reserved.
* Copyright 2016 Gary Mills * Copyright 2016 Gary Mills
* Copyright (c) 2017 Datto Inc. * Copyright (c) 2017 Datto Inc.
* Copyright 2017 Joyent, Inc. * Copyright 2019 Joyent, Inc.
*/ */
#include <sys/dsl_scan.h> #include <sys/dsl_scan.h>
@ -955,14 +955,16 @@ dsl_scan_done(dsl_scan_t *scn, boolean_t complete, dmu_tx_t *tx)
* will find the drives that need to be resilvered * will find the drives that need to be resilvered
* when the machine reboots and start the resilver then. * when the machine reboots and start the resilver then.
*/ */
boolean_t resilver_needed = if (spa_feature_is_enabled(spa, SPA_FEATURE_RESILVER_DEFER)) {
dsl_scan_clear_deferred(spa->spa_root_vdev, tx); boolean_t resilver_needed =
if (resilver_needed) { dsl_scan_clear_deferred(spa->spa_root_vdev, tx);
spa_history_log_internal(spa, if (resilver_needed) {
"starting deferred resilver", tx, spa_history_log_internal(spa,
"errors=%llu", "starting deferred resilver", tx,
(u_longlong_t)spa_get_errlog_size(spa)); "errors=%llu",
spa_async_request(spa, SPA_ASYNC_RESILVER); (u_longlong_t)spa_get_errlog_size(spa));
spa_async_request(spa, SPA_ASYNC_RESILVER);
}
} }
} }