From cc38de1a391234a176796bbc4ea8a1c5053a4e3d Mon Sep 17 00:00:00 2001 From: Viraj Jasani Date: Mon, 1 Jul 2019 00:08:56 +0530 Subject: [PATCH] HBASE-22643 : Delete region without archiving only if regiondir is present Signed-off-by: Wellington Chevreuil Signed-off-by: Xu Cang --- .../hadoop/hbase/backup/HFileArchiver.java | 4 +- .../hbase/backup/TestHFileArchiving.java | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/backup/HFileArchiver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/backup/HFileArchiver.java index 4fb9f4f08d23..53d2dbb06534 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/backup/HFileArchiver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/backup/HFileArchiver.java @@ -120,7 +120,9 @@ public static boolean archiveRegion(FileSystem fs, Path rootdir, Path tableDir, if (tableDir == null || regionDir == null) { LOG.error("No archive directory could be found because tabledir (" + tableDir + ") or regiondir (" + regionDir + "was null. Deleting files instead."); - deleteRegionWithoutArchiving(fs, regionDir); + if (regionDir != null) { + deleteRegionWithoutArchiving(fs, regionDir); + } // we should have archived, but failed to. Doesn't matter if we deleted // the archived files correctly or not. return false; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/TestHFileArchiving.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/TestHFileArchiving.java index eee0ac3d3c5d..144cdfd5b358 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/TestHFileArchiving.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/backup/TestHFileArchiving.java @@ -526,6 +526,50 @@ public void testCleaningRace() throws Exception { } } + @Test + public void testArchiveRegionTableAndRegionDirsNull() throws IOException { + Path rootDir = UTIL.getDataTestDirOnTestFS("testCleaningRace"); + FileSystem fileSystem = UTIL.getTestFileSystem(); + // Try to archive the file but with null regionDir, can't delete sourceFile + assertFalse(HFileArchiver.archiveRegion(fileSystem, rootDir, null, null)); + } + + @Test + public void testArchiveRegionWithTableDirNull() throws IOException { + Path regionDir = new Path(FSUtils.getTableDir(new Path("./"), + TableName.valueOf(name.getMethodName())), "xyzabc"); + Path familyDir = new Path(regionDir, "rd"); + Path rootDir = UTIL.getDataTestDirOnTestFS("testCleaningRace"); + Path file = new Path(familyDir, "1"); + Path sourceFile = new Path(rootDir, file); + FileSystem fileSystem = UTIL.getTestFileSystem(); + fileSystem.createNewFile(sourceFile); + Path sourceRegionDir = new Path(rootDir, regionDir); + fileSystem.mkdirs(sourceRegionDir); + // Try to archive the file + assertFalse(HFileArchiver.archiveRegion(fileSystem, rootDir, null, sourceRegionDir)); + assertFalse(fileSystem.exists(sourceRegionDir)); + } + + @Test + public void testArchiveRegionWithRegionDirNull() throws IOException { + Path regionDir = new Path(FSUtils.getTableDir(new Path("./"), + TableName.valueOf(name.getMethodName())), "elgn4nf"); + Path familyDir = new Path(regionDir, "rdar"); + Path rootDir = UTIL.getDataTestDirOnTestFS("testCleaningRace"); + Path file = new Path(familyDir, "2"); + Path sourceFile = new Path(rootDir, file); + FileSystem fileSystem = UTIL.getTestFileSystem(); + fileSystem.createNewFile(sourceFile); + Path sourceRegionDir = new Path(rootDir, regionDir); + fileSystem.mkdirs(sourceRegionDir); + // Try to archive the file but with null regionDir, can't delete sourceFile + assertFalse(HFileArchiver.archiveRegion(fileSystem, rootDir, sourceRegionDir.getParent(), + null)); + assertTrue(fileSystem.exists(sourceRegionDir)); + fileSystem.delete(sourceRegionDir, true); + } + // Avoid passing a null master to CleanerChore, see HBASE-21175 private HFileCleaner getHFileCleaner(Stoppable stoppable, Configuration conf, FileSystem fs, Path archiveDir) throws IOException {