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;
}
}
+ /*
+ * 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);
#
# DESCRIPTION:
-# Ensure that checkpoint verification within zdb wowrks as
+# Ensure that checkpoint verification within zdb works as
# we expect.
#
# STRATEGY:
# 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.
#
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" && \
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