Repository: hbase Updated Branches: refs/heads/branch-1 b73aab8bc -> d385ba1a5
http://git-wip-us.apache.org/repos/asf/hbase/blob/d385ba1a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.java index 6583b2c..ea44eb4 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.java @@ -18,10 +18,12 @@ package org.apache.hadoop.hbase.snapshot; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; +import java.net.URI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -32,6 +34,7 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper; +import org.apache.hadoop.hbase.util.FSUtils; import org.junit.After; import org.junit.BeforeClass; import org.junit.Test; @@ -91,14 +94,118 @@ public class TestSnapshotDescriptionUtils { Path snapshotDir = new Path(root, HConstants.SNAPSHOT_DIR_NAME); Path tmpDir = new Path(snapshotDir, ".tmp"); Path workingDir = new Path(tmpDir, "not_a_snapshot"); + Configuration conf = new Configuration(); assertFalse("Already have working snapshot dir: " + workingDir + " but shouldn't. Test file leak?", fs.exists(workingDir)); - SnapshotDescription snapshot = SnapshotDescription.newBuilder().setName("snapshot").build(); try { - SnapshotDescriptionUtils.completeSnapshot(snapshot, root, workingDir, fs); + SnapshotDescriptionUtils.completeSnapshot(snapshotDir, workingDir, fs, + workingDir.getFileSystem(conf), conf); fail("Shouldn't successfully complete move of a non-existent directory."); } catch (IOException e) { - LOG.info("Correctly failed to move non-existant directory: " + e.getMessage()); + LOG.info("Correctly failed to move non-existant directory: ", e); } } + + @Test + public void testIsSubDirectoryWorks() { + Path rootDir = new Path("hdfs://root/.hbase-snapshot/"); + + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(rootDir, rootDir)); + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf( + new Path("hdfs://root/.hbase-snapshotdir"), rootDir)); + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf( + new Path("hdfs://root/.hbase-snapshot"), rootDir)); + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf( + new Path("hdfs://.hbase-snapshot"), rootDir)); + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf( + new Path("hdfs://.hbase-snapshot/.tmp"), rootDir)); + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(new Path("hdfs://root"), rootDir)); + assertTrue(SnapshotDescriptionUtils.isSubDirectoryOf( + new Path("hdfs://root/.hbase-snapshot/.tmp"), rootDir)); + assertTrue(SnapshotDescriptionUtils.isSubDirectoryOf( + new Path("hdfs://root/.hbase-snapshot/.tmp/snapshot"), rootDir)); + + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf( + new Path("s3://root/.hbase-snapshot/"), rootDir)); + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(new Path("s3://root"), rootDir)); + assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf( + new Path("s3://root/.hbase-snapshot/.tmp/snapshot"), rootDir)); + } + + @Test + public void testIsWithinWorkingDir() throws IOException { + Configuration conf = new Configuration(); + FSUtils.setRootDir(conf, root); + + Path rootDir = root.makeQualified(fs); + + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + rootDir, conf)); + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + new Path(rootDir,".hbase-snapshotdir"), conf)); + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + new Path(rootDir,".hbase-snapshot"), conf)); + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + new Path("hdfs://.hbase-snapshot"), conf)); + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + new Path("hdfs://.hbase-snapshot/.tmp"), conf)); + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(new Path("hdfs://root"), conf)); + assertTrue(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + new Path(rootDir,".hbase-snapshot/.tmp"), conf)); + assertTrue(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + new Path(rootDir, ".hbase-snapshot/.tmp/snapshot"), conf)); + + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + new Path("s3://root/.hbase-snapshot/"), conf)); + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(new Path("s3://root"), conf)); + assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir( + new Path("s3://root/.hbase-snapshot/.tmp/snapshot"), conf)); + } + + @Test + public void testShouldSkipRenameSnapshotDirectories() { + URI workingDirURI = URI.create("/User/test1"); + URI rootDirURI = URI.create("hdfs:///User/test2"); + + // should skip rename if it's not the same scheme; + assertTrue( + SnapshotDescriptionUtils.shouldSkipRenameSnapshotDirectories(workingDirURI, rootDirURI)); + + workingDirURI = URI.create("/User/test1"); + rootDirURI = URI.create("file:///User/test2"); + assertFalse( + SnapshotDescriptionUtils.shouldSkipRenameSnapshotDirectories(workingDirURI, rootDirURI)); + + // skip rename when either scheme or authority are the not same + workingDirURI = URI.create("hdfs://localhost:8020/User/test1"); + rootDirURI = URI.create("hdfs://otherhost:8020/User/test2"); + assertTrue( + SnapshotDescriptionUtils.shouldSkipRenameSnapshotDirectories(workingDirURI, rootDirURI)); + + workingDirURI = URI.create("file:///User/test1"); + rootDirURI = URI.create("hdfs://localhost:8020/User/test2"); + assertTrue( + SnapshotDescriptionUtils.shouldSkipRenameSnapshotDirectories(workingDirURI, rootDirURI)); + + workingDirURI = URI.create("hdfs:///User/test1"); + rootDirURI = URI.create("hdfs:///User/test2"); + assertFalse( + SnapshotDescriptionUtils.shouldSkipRenameSnapshotDirectories(workingDirURI, rootDirURI)); + + workingDirURI = URI.create("hdfs://localhost:8020/User/test1"); + rootDirURI = URI.create("hdfs://localhost:8020/User/test2"); + assertFalse( + SnapshotDescriptionUtils.shouldSkipRenameSnapshotDirectories(workingDirURI, rootDirURI)); + + workingDirURI = URI.create("hdfs://user:password@localhost:8020/User/test1"); + rootDirURI = URI.create("hdfs://user:password@localhost:8020/User/test2"); + assertFalse( + SnapshotDescriptionUtils.shouldSkipRenameSnapshotDirectories(workingDirURI, rootDirURI)); + + // skip rename when user information is not the same + workingDirURI = URI.create("hdfs://user:password@localhost:8020/User/test1"); + rootDirURI = URI.create("hdfs://user2:password2@localhost:8020/User/test2"); + assertTrue( + SnapshotDescriptionUtils.shouldSkipRenameSnapshotDirectories(workingDirURI, rootDirURI)); + } }