zdb -k does not work on Linux when used with -e

This minor bug was introduced with the port of the feature from
OpenZFS to ZoL. This patch fixes the issue that was caused by
a minor re-ordering from the original code.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Tim Chase <tim@chase2k.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Serapheim Dimitropoulos <serapheim@delphix.com>
Closes #8001
This commit is contained in:
Serapheim Dimitropoulos 2018-10-30 09:46:18 -07:00 committed by Brian Behlendorf
parent 63a77ae3cf
commit 0a544c174d
3 changed files with 50 additions and 16 deletions

View File

@ -6057,17 +6057,6 @@ main(int argc, char **argv)
error = 0;
target = argv[0];
char *checkpoint_pool = NULL;
char *checkpoint_target = NULL;
if (dump_opt['k']) {
checkpoint_pool = import_checkpointed_state(target, cfg,
&checkpoint_target);
if (checkpoint_target != NULL)
target = checkpoint_target;
}
if (strpbrk(target, "/@") != NULL) {
size_t targetlen;
@ -6113,6 +6102,24 @@ main(int argc, char **argv)
}
}
/*
* import_checkpointed_state makes the assumption that the
* target pool that we pass it is already part of the spa
* namespace. Because of that we need to make sure to call
* it always after the -e option has been processed, which
* imports the pool to the namespace if it's not in the
* cachefile.
*/
char *checkpoint_pool = NULL;
char *checkpoint_target = NULL;
if (dump_opt['k']) {
checkpoint_pool = import_checkpointed_state(target, cfg,
&checkpoint_target);
if (checkpoint_target != NULL)
target = checkpoint_target;
}
if (target_pool != target)
free(target_pool);

View File

@ -19,7 +19,7 @@
#
# DESCRIPTION:
# Ensure that checkpoint verification within zdb wowrks as
# Ensure that checkpoint verification within zdb works as
# we expect.
#
# STRATEGY:
@ -30,10 +30,12 @@
# 5. Verify zdb finds checkpoint when run on current state
# 6. Verify zdb finds old dataset when run on checkpointed
# state
# 7. Discard checkpoint
# 8. Verify zdb does not find the checkpoint anymore in the
# 7. Export pool, and verify the same things with zdb to
# test the -e option.
# 8. Import pool and discard checkpoint
# 9. Verify zdb does not find the checkpoint anymore in the
# current state.
# 9. Verify that zdb cannot find the checkpointed state
# 10.Verify that zdb cannot find the checkpointed state
# anymore when trying to open it for verification.
#
@ -68,6 +70,22 @@ zdb $TESTPOOL | grep "Dataset $FS1" && \
zdb -k $TESTPOOL | grep "Dataset $CHECKPOINTED_FS1" || \
log_fail "zdb could not find destroyed dataset in checkpoint"
log_must zpool export $TESTPOOL
zdb -e $TESTPOOL | grep "Checkpointed uberblock found" || \
log_fail "zdb could not find checkpointed uberblock"
zdb -k -e $TESTPOOL | grep "Checkpointed uberblock found" && \
log_fail "zdb found checkpointed uberblock in checkpointed state"
zdb -e $TESTPOOL | grep "Dataset $FS1" && \
log_fail "zdb found destroyed dataset in current state"
zdb -k -e $TESTPOOL | grep "Dataset $CHECKPOINTED_FS1" || \
log_fail "zdb could not find destroyed dataset in checkpoint"
log_must zpool import $TESTPOOL
log_must zpool checkpoint -d $TESTPOOL
zdb $TESTPOOL | grep "Checkpointed uberblock found" && \

View File

@ -161,7 +161,16 @@ function cleanup_nested_pool
function cleanup_test_pool
{
log_must zpool destroy $TESTPOOL
zpool labelclear -f "$TESTDISK"
#
# We always clear the labels of all disks
# between tests so imports from zpool or
# or zdb do not get confused with leftover
# data from old pools.
#
for disk in $DISKS; do
zpool labelclear -f $disk
done
}
function cleanup_nested_pools