]> git.proxmox.com Git - mirror_zfs.git/commitdiff
zdb -k does not work on Linux when used with -e
authorSerapheim Dimitropoulos <serapheimd@gmail.com>
Tue, 30 Oct 2018 16:46:18 +0000 (09:46 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 30 Oct 2018 16:46:18 +0000 (11:46 -0500)
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

cmd/zdb/zdb.c
tests/zfs-tests/tests/functional/pool_checkpoint/checkpoint_zdb.ksh
tests/zfs-tests/tests/functional/pool_checkpoint/pool_checkpoint.kshlib

index cdea1e5843494ad4f21587972aa0006667f46944..737217538578c4fd4ec5336accd8894c3c7e0103 100644 (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);
 
index 50c45b5b49a32ea89a04f29ce57074046b3f73b0..fdefc0c3bdbb70da203b3e9217fbd44c4699c62e 100755 (executable)
@@ -19,7 +19,7 @@
 
 #
 # 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.
 #
 
@@ -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" && \
index cac05b3926458d234a48516b3ad0c1e81c5425a7..3638e3dfec982e4b0be04447c3494e0d49c62b61 100644 (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