mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Illumos 5243 - zdb -b could be much faster
5243 zdb -b could be much faster Reviewed by: Christopher Siden <christopher.siden@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Richard Elling <richard.elling@gmail.com> Approved by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/5243 https://github.com/illumos/illumos-gate/commit/f7950bf Ported-by: Don Brady <don.brady@intel.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #3414
This commit is contained in:
committed by
Brian Behlendorf
parent
b1b85c8772
commit
e5fd1dd682
+22
-19
@@ -58,6 +58,7 @@ typedef struct traverse_data {
|
||||
int td_flags;
|
||||
prefetch_data_t *td_pfd;
|
||||
boolean_t td_paused;
|
||||
uint64_t td_hole_birth_enabled_txg;
|
||||
blkptr_cb_t *td_func;
|
||||
void *td_arg;
|
||||
} traverse_data_t;
|
||||
@@ -226,25 +227,20 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
|
||||
}
|
||||
|
||||
if (bp->blk_birth == 0) {
|
||||
if (spa_feature_is_active(td->td_spa, SPA_FEATURE_HOLE_BIRTH)) {
|
||||
/*
|
||||
* Since this block has a birth time of 0 it must be a
|
||||
* hole created before the SPA_FEATURE_HOLE_BIRTH
|
||||
* feature was enabled. If SPA_FEATURE_HOLE_BIRTH
|
||||
* was enabled before the min_txg for this traveral we
|
||||
* know the hole must have been created before the
|
||||
* min_txg for this traveral, so we can skip it. If
|
||||
* SPA_FEATURE_HOLE_BIRTH was enabled after the min_txg
|
||||
* for this traveral we cannot tell if the hole was
|
||||
* created before or after the min_txg for this
|
||||
* traversal, so we cannot skip it.
|
||||
*/
|
||||
uint64_t hole_birth_enabled_txg;
|
||||
VERIFY(spa_feature_enabled_txg(td->td_spa,
|
||||
SPA_FEATURE_HOLE_BIRTH, &hole_birth_enabled_txg));
|
||||
if (hole_birth_enabled_txg < td->td_min_txg)
|
||||
return (0);
|
||||
}
|
||||
/*
|
||||
* Since this block has a birth time of 0 it must be a
|
||||
* hole created before the SPA_FEATURE_HOLE_BIRTH
|
||||
* feature was enabled. If SPA_FEATURE_HOLE_BIRTH
|
||||
* was enabled before the min_txg for this traveral we
|
||||
* know the hole must have been created before the
|
||||
* min_txg for this traveral, so we can skip it. If
|
||||
* SPA_FEATURE_HOLE_BIRTH was enabled after the min_txg
|
||||
* for this traveral we cannot tell if the hole was
|
||||
* created before or after the min_txg for this
|
||||
* traversal, so we cannot skip it.
|
||||
*/
|
||||
if (td->td_hole_birth_enabled_txg < td->td_min_txg)
|
||||
return (0);
|
||||
} else if (bp->blk_birth <= td->td_min_txg) {
|
||||
return (0);
|
||||
}
|
||||
@@ -533,6 +529,13 @@ traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp,
|
||||
td->td_flags = flags;
|
||||
td->td_paused = B_FALSE;
|
||||
|
||||
if (spa_feature_is_active(spa, SPA_FEATURE_HOLE_BIRTH)) {
|
||||
VERIFY(spa_feature_enabled_txg(spa,
|
||||
SPA_FEATURE_HOLE_BIRTH, &td->td_hole_birth_enabled_txg));
|
||||
} else {
|
||||
td->td_hole_birth_enabled_txg = 0;
|
||||
}
|
||||
|
||||
pd->pd_flags = flags;
|
||||
mutex_init(&pd->pd_mtx, NULL, MUTEX_DEFAULT, NULL);
|
||||
cv_init(&pd->pd_cv, NULL, CV_DEFAULT, NULL);
|
||||
|
||||
Reference in New Issue
Block a user