This is an automated email from the ASF dual-hosted git repository. zyork pushed a commit to branch branch-2 in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push: new 3cc8b36 HBASE-21070 Add Test for SnapshotFileCache for HBase backed by S3 (#209) 3cc8b36 is described below commit 3cc8b36fd3e194086516a1f9b5814707ede46ade Author: z-york <zy...@amazon.com> AuthorDate: Mon May 6 11:52:08 2019 -0700 HBASE-21070 Add Test for SnapshotFileCache for HBase backed by S3 (#209) SnapshotFileCache depends on getting the last modified time of the snapshot directory, however, S3 FileSystem's do not update the last modified time of the top 'folder' when objects are added/removed. This commit adds a test for the previously fixed SnapshotFileCache. --- .../master/snapshot/TestSnapshotFileCache.java | 64 ++++++++++++++-------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.java index 800def6..cb53cf7 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.java @@ -58,14 +58,18 @@ public class TestSnapshotFileCache { private static final Logger LOG = LoggerFactory.getLogger(TestSnapshotFileCache.class); private static final HBaseTestingUtility UTIL = new HBaseTestingUtility(); + // don't refresh the cache unless we tell it to + private static final long PERIOD = Long.MAX_VALUE; private static FileSystem fs; private static Path rootDir; + private static Path snapshotDir; @BeforeClass public static void startCluster() throws Exception { UTIL.startMiniDFSCluster(1); fs = UTIL.getDFSCluster().getFileSystem(); rootDir = UTIL.getDefaultRootDirPath(); + snapshotDir = SnapshotDescriptionUtils.getSnapshotsDir(rootDir); } @AfterClass @@ -76,48 +80,57 @@ public class TestSnapshotFileCache { @After public void cleanupFiles() throws Exception { // cleanup the snapshot directory - Path snapshotDir = SnapshotDescriptionUtils.getSnapshotsDir(rootDir); fs.delete(snapshotDir, true); } @Test public void testLoadAndDelete() throws IOException { - // don't refresh the cache unless we tell it to - long period = Long.MAX_VALUE; - SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000, + SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, PERIOD, 10000000, "test-snapshot-file-cache-refresh", new SnapshotFiles()); - createAndTestSnapshotV1(cache, "snapshot1a", false, true); + createAndTestSnapshotV1(cache, "snapshot1a", false, true, false); - createAndTestSnapshotV2(cache, "snapshot2a", false, true); + createAndTestSnapshotV2(cache, "snapshot2a", false, true, false); } @Test public void testReloadModifiedDirectory() throws IOException { - // don't refresh the cache unless we tell it to - long period = Long.MAX_VALUE; - SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000, + SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, PERIOD, 10000000, "test-snapshot-file-cache-refresh", new SnapshotFiles()); - createAndTestSnapshotV1(cache, "snapshot1", false, true); + createAndTestSnapshotV1(cache, "snapshot1", false, true, false); // now delete the snapshot and add a file with a different name - createAndTestSnapshotV1(cache, "snapshot1", false, false); + createAndTestSnapshotV1(cache, "snapshot1", false, false, false); - createAndTestSnapshotV2(cache, "snapshot2", false, true); + createAndTestSnapshotV2(cache, "snapshot2", false, true, false); // now delete the snapshot and add a file with a different name - createAndTestSnapshotV2(cache, "snapshot2", false, false); + createAndTestSnapshotV2(cache, "snapshot2", false, false, false); } @Test public void testSnapshotTempDirReload() throws IOException { - long period = Long.MAX_VALUE; - // This doesn't refresh cache until we invoke it explicitly - SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000, + SnapshotFileCache cache = + new SnapshotFileCache(fs, rootDir, PERIOD, 10000000, "test-snapshot-file-cache-refresh", new SnapshotFiles()); + + // Add a new non-tmp snapshot + createAndTestSnapshotV1(cache, "snapshot0v1", false, false, false); + createAndTestSnapshotV1(cache, "snapshot0v2", false, false, false); + } + + @Test + public void testCacheUpdatedWhenLastModifiedOfSnapDirNotUpdated() throws IOException { + SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, PERIOD, 10000000, "test-snapshot-file-cache-refresh", new SnapshotFiles()); // Add a new non-tmp snapshot - createAndTestSnapshotV1(cache, "snapshot0v1", false, false); - createAndTestSnapshotV1(cache, "snapshot0v2", false, false); + createAndTestSnapshotV1(cache, "snapshot1v1", false, false, true); + createAndTestSnapshotV1(cache, "snapshot1v2", false, false, true); + + // Add a new tmp snapshot + createAndTestSnapshotV2(cache, "snapshot2v1", true, false, true); + + // Add another tmp snapshot + createAndTestSnapshotV2(cache, "snapshot2v2", true, false, true); } class SnapshotFiles implements SnapshotFileCache.SnapshotFileInspector { @@ -130,23 +143,24 @@ public class TestSnapshotFileCache { }; private SnapshotMock.SnapshotBuilder createAndTestSnapshotV1(final SnapshotFileCache cache, - final String name, final boolean tmp, final boolean removeOnExit) throws IOException { + final String name, final boolean tmp, final boolean removeOnExit, boolean setFolderTime) + throws IOException { SnapshotMock snapshotMock = new SnapshotMock(UTIL.getConfiguration(), fs, rootDir); SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV1(name, name); - createAndTestSnapshot(cache, builder, tmp, removeOnExit); + createAndTestSnapshot(cache, builder, tmp, removeOnExit, setFolderTime); return builder; } private void createAndTestSnapshotV2(final SnapshotFileCache cache, final String name, - final boolean tmp, final boolean removeOnExit) throws IOException { + final boolean tmp, final boolean removeOnExit, boolean setFolderTime) throws IOException { SnapshotMock snapshotMock = new SnapshotMock(UTIL.getConfiguration(), fs, rootDir); SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(name, name); - createAndTestSnapshot(cache, builder, tmp, removeOnExit); + createAndTestSnapshot(cache, builder, tmp, removeOnExit, setFolderTime); } private void createAndTestSnapshot(final SnapshotFileCache cache, final SnapshotMock.SnapshotBuilder builder, - final boolean tmp, final boolean removeOnExit) throws IOException { + final boolean tmp, final boolean removeOnExit, boolean setFolderTime) throws IOException { List<Path> files = new ArrayList<>(); for (int i = 0; i < 3; ++i) { for (Path filePath: builder.addRegion()) { @@ -157,6 +171,10 @@ public class TestSnapshotFileCache { // Finalize the snapshot builder.commit(); + if (setFolderTime) { + fs.setTimes(snapshotDir, 0, -1); + } + // Make sure that all files are still present for (Path path: files) { assertFalse("Cache didn't find " + path, contains(getNonSnapshotFiles(cache, path), path));