diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java index c5a724a..6b3541f 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java @@ -701,6 +701,9 @@ public class HBaseFsck extends Configured implements Closeable { oldSplitAndMerge = admin.setSplitOrMergeEnabled(false, false, false, Admin.MasterSwitchType.SPLIT, Admin.MasterSwitchType.MERGE); } + // CatalogJanitor would clean up offline parent region and leave lingering reference files. + // Therefore, it cannot be run during repair. + boolean oldCatalogJanitorState = admin.enableCatalogJanitor(false); try { onlineConsistencyRepair(); @@ -718,6 +721,8 @@ public class HBaseFsck extends Configured implements Closeable { admin.releaseSplitOrMergeLockAndRollback(); } } + // Restore to prior state. + admin.enableCatalogJanitor(oldCatalogJanitorState); } if (checkRegionBoundaries) { @@ -2519,8 +2524,21 @@ public class HBaseFsck extends Configured implements Closeable { // it moves the src into the dst dir resulting in (foo/a/b). If // the dst does not exist, and the src a dir, src becomes dst. (foo/b) for (FileStatus hfile : fs.listStatus(src)) { + if (StoreFileInfo.isReference(hfile.getPath())) { + // do not move reference files + if (LOG.isDebugEnabled()) { + LOG.debug( + "[" + thread + "] Skipping move reference file " + hfile.getPath() + + " into containing region " + dst); + } + continue; + } boolean success = fs.rename(hfile.getPath(), dst); if (success) { + if (LOG.isDebugEnabled()) { + LOG.debug( + "[" + thread + "] Moving " + hfile.getPath() + " into containing region " + dst); + } fileMoves++; } }