diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/snapshot/ExportSnapshot.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/snapshot/ExportSnapshot.java index da6d83af9b3..26e9dccef83 100644 --- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/snapshot/ExportSnapshot.java +++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/snapshot/ExportSnapshot.java @@ -141,6 +141,8 @@ public class ExportSnapshot extends AbstractHBaseTool implements Tool { "Do not verify checksum, use name+length only."); static final Option NO_TARGET_VERIFY = new Option(null, "no-target-verify", false, "Do not verify the integrity of the exported snapshot."); + static final Option NO_SOURCE_VERIFY = new Option(null, "no-source-verify", false, + "Do not verify the source of the snapshot."); static final Option OVERWRITE = new Option(null, "overwrite", false, "Rewrite the snapshot manifest if already exists."); static final Option CHUSER = new Option(null, "chuser", true, @@ -911,6 +913,7 @@ public class ExportSnapshot extends AbstractHBaseTool implements Tool { } private boolean verifyTarget = true; + private boolean verifySource = true; private boolean verifyChecksum = true; private String snapshotName = null; private String targetName = null; @@ -942,6 +945,7 @@ public class ExportSnapshot extends AbstractHBaseTool implements Tool { // And verifyChecksum and verifyTarget with values read from old args in processOldArgs(...). verifyChecksum = !cmd.hasOption(Options.NO_CHECKSUM_VERIFY.getLongOpt()); verifyTarget = !cmd.hasOption(Options.NO_TARGET_VERIFY.getLongOpt()); + verifySource = !cmd.hasOption(Options.NO_SOURCE_VERIFY.getLongOpt()); } /** @@ -992,6 +996,13 @@ public class ExportSnapshot extends AbstractHBaseTool implements Tool { LOG.debug("outputFs={}, outputRoot={}, skipTmp={}, initialOutputSnapshotDir={}", outputFs, outputRoot.toString(), skipTmp, initialOutputSnapshotDir); + // Verify snapshot source before copying files + if (verifySource) { + LOG.info("Verify snapshot source, inputFs={}, inputRoot={}, snapshotDir={}.", + inputFs.getUri(), inputRoot, snapshotDir); + verifySnapshot(srcConf, inputFs, inputRoot, snapshotDir); + } + // Find the necessary directory which need to change owner and group Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot); if (outputFs.exists(needSetOwnerDir)) { @@ -1142,6 +1153,7 @@ public class ExportSnapshot extends AbstractHBaseTool implements Tool { addOption(Options.TARGET_NAME); addOption(Options.NO_CHECKSUM_VERIFY); addOption(Options.NO_TARGET_VERIFY); + addOption(Options.NO_SOURCE_VERIFY); addOption(Options.OVERWRITE); addOption(Options.CHUSER); addOption(Options.CHGROUP);