]> granicus.if.org Git - zfs/commit
Fix stalled txg with repeated noop scans
authorTom Caputi <tcaputi@datto.com>
Wed, 11 Sep 2019 18:16:48 +0000 (14:16 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 11 Sep 2019 18:16:48 +0000 (11:16 -0700)
commit5815f7ac30e108fcbf4c6487328c28d818e9e014
tree7ef5339fe09e98b3fdb7ef768a78fa43a1d0c68b
parent5b51c15861a0c066b25bfa4741a6df16d0c63884
Fix stalled txg with repeated noop scans

Currently, the DSL scan code figures out when it should suspend
processing and allow a txg to continue by calling the function
dsl_scan_check_suspend(). Unfortunately, this function only
allows the scan to suspend at a level 0 block. In the event that
the system is scanning a bunch of empty snapshots or a resilver
is running with a high enough scn_cur_min_txg, the scan will
stop processing each dataset at the root level, deciding it
has nothing left to do. This means that the check_suspend
function is never called and the txg remains stuck until a
dataset is found that has data to scan.

This patch fixes the problem by allowing scans to suspend at
the root level of the objset. For backwards compatibility, we
use the bookmark <objsetid, 0, 0, 0> when we suspend here so
that older versions of the code will work as intended.

Reviewed-by: Matt Ahrens <matt@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #9300
module/zfs/dsl_scan.c