You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2020/06/17 16:58:46 UTC

[hbase-operator-tools] branch master updated: HBASE-24482 [hbase-operator-tools] build of hbck2 fails with HBase branch-2.3, due to missing dependencies

This is an automated email from the ASF dual-hosted git repository.

stack pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase-operator-tools.git


The following commit(s) were added to refs/heads/master by this push:
     new 8d71617  HBASE-24482 [hbase-operator-tools] build of hbck2 fails with HBase branch-2.3, due to missing dependencies
8d71617 is described below

commit 8d716173b6f713d3b375f9eef18189cf2f1a3745
Author: stack <st...@apache.org>
AuthorDate: Wed Jun 17 09:49:32 2020 -0700

    HBASE-24482 [hbase-operator-tools] build of hbck2 fails with HBase branch-2.3, due to missing dependencies
    
    Make it so we compile and tests pass against hbase-2.3.x as
    well as 2.1.x.
    
    Remove use of @Nullable -- nice-to-have but dodgy provenance.
    
    Use CommonFSUtils instead of FSUtils as latter no longer subclasses
    CommonFSUtils whose utility we make use of in our import of hbck1
    functionality (TODO: Undo this reliance on IA.Private)
    
    hbase-hbck2/src/main/java/org/apache/hbase/FileSystemFsck.java
    hbase-hbck2/src/main/java/org/apache/hbase/FsRegionsMetaRecoverer.java
    hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsck.java
    hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsckRepair.java
    hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HFileCorruptionChecker.java
    hbase-hbck2/src/main/java/org/apache/hbase/hbck1/OfflineMetaRepair.java
    hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java
     s/CommonFSUtils/FSUtils/g
    
    hbase-hbck2/src/main/java/org/apache/hbase/HBCKMetaTableAccessor.java
     Purge @Nullable usage.
    
    hbase-hbck2/src/test/java/org/apache/hbase/TestSchedulingRecoveries.java
     Remove test that behaves differently between 2.1.x and 2.3.x hbase.
    
    hbase-tools/src/test/java/org/apache/hbase/TestRegionsMerger.java
     Amend test where merging works differently between hbase-2.3.x and
     hbase-2.1.x (2.3 does more protective checks).
---
 .../main/java/org/apache/hbase/FileSystemFsck.java |  5 +-
 .../org/apache/hbase/FsRegionsMetaRecoverer.java   |  2 +-
 .../org/apache/hbase/HBCKMetaTableAccessor.java    |  8 +--
 .../java/org/apache/hbase/hbck1/HBaseFsck.java     | 66 +++++++++-------------
 .../org/apache/hbase/hbck1/HBaseFsckRepair.java    |  3 +-
 .../apache/hbase/hbck1/HFileCorruptionChecker.java |  5 +-
 .../org/apache/hbase/hbck1/OfflineMetaRepair.java  |  7 ++-
 .../src/test/java/org/apache/hbase/TestHBCK2.java  |  3 +-
 .../org/apache/hbase/TestSchedulingRecoveries.java | 22 +-------
 .../java/org/apache/hbase/TestRegionsMerger.java   | 14 ++---
 10 files changed, 51 insertions(+), 84 deletions(-)

diff --git a/hbase-hbck2/src/main/java/org/apache/hbase/FileSystemFsck.java b/hbase-hbck2/src/main/java/org/apache/hbase/FileSystemFsck.java
index 47892b9..d062a1d 100644
--- a/hbase-hbck2/src/main/java/org/apache/hbase/FileSystemFsck.java
+++ b/hbase-hbck2/src/main/java/org/apache/hbase/FileSystemFsck.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hbase.hbck1.HBaseFsck;
 import org.apache.hbase.hbck1.HFileCorruptionChecker;
@@ -46,7 +47,7 @@ public class FileSystemFsck implements Closeable {
 
   FileSystemFsck(Configuration conf) throws IOException {
     this.configuration = conf;
-    this.rootDir = FSUtils.getRootDir(this.configuration);
+    this.rootDir = CommonFSUtils.getRootDir(this.configuration);
     this.fs = rootDir.getFileSystem(this.configuration);
 
   }
@@ -82,7 +83,7 @@ public class FileSystemFsck implements Closeable {
       Collection<String> tables = commandLine.getArgList();
       Collection<Path> tableDirs = tables.isEmpty()?
           FSUtils.getTableDirs(this.fs, this.rootDir):
-          tables.stream().map(t -> FSUtils.getTableDir(this.rootDir, TableName.valueOf(t))).
+          tables.stream().map(t -> CommonFSUtils.getTableDir(this.rootDir, TableName.valueOf(t))).
               collect(Collectors.toList());
       hfcc.checkTables(tableDirs);
       hfcc.report(hbaseFsck.getErrors());
diff --git a/hbase-hbck2/src/main/java/org/apache/hbase/FsRegionsMetaRecoverer.java b/hbase-hbck2/src/main/java/org/apache/hbase/FsRegionsMetaRecoverer.java
index b6cb28b..d1e7a6c 100644
--- a/hbase-hbck2/src/main/java/org/apache/hbase/FsRegionsMetaRecoverer.java
+++ b/hbase-hbck2/src/main/java/org/apache/hbase/FsRegionsMetaRecoverer.java
@@ -77,7 +77,7 @@ public class FsRegionsMetaRecoverer implements Closeable {
 
   private List<Path> getTableRegionsDirs(String table) throws IOException {
     String hbaseRoot = this.config.get(HConstants.HBASE_DIR);
-    Path tableDir = FSUtils.getTableDir(new Path(hbaseRoot), TableName.valueOf(table));
+    Path tableDir = CommonFSUtils.getTableDir(new Path(hbaseRoot), TableName.valueOf(table));
     return FSUtils.getRegionDirs(fs, tableDir);
   }
 
diff --git a/hbase-hbck2/src/main/java/org/apache/hbase/HBCKMetaTableAccessor.java b/hbase-hbck2/src/main/java/org/apache/hbase/HBCKMetaTableAccessor.java
index e5e4acc..4b8f961 100644
--- a/hbase-hbck2/src/main/java/org/apache/hbase/HBCKMetaTableAccessor.java
+++ b/hbase-hbck2/src/main/java/org/apache/hbase/HBCKMetaTableAccessor.java
@@ -22,8 +22,6 @@ import static org.apache.hadoop.hbase.HConstants.REGIONINFO_QUALIFIER;
 import static org.apache.hadoop.hbase.HConstants.TABLE_FAMILY;
 import static org.apache.hadoop.hbase.HConstants.TABLE_STATE_QUALIFIER;
 
-import edu.umd.cs.findbugs.annotations.Nullable;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -65,6 +63,7 @@ import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.Pair;
 import org.apache.hadoop.hbase.util.PairOfSameType;
+
 import org.apache.yetus.audience.InterfaceAudience;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -391,7 +390,6 @@ public final class HBCKMetaTableAccessor {
    * (Copied from MetaTableAccessor)
    * @return null if not found
    */
-  @Nullable
   public static TableState getTableState(Result r) throws IOException {
     Cell cell = r.getColumnLatestCell(TABLE_FAMILY, TABLE_STATE_QUALIFIER);
     if (cell == null) {
@@ -411,7 +409,6 @@ public final class HBCKMetaTableAccessor {
    * @param conn connection to use
    * @param tableName table to fetch state for
    */
-  @Nullable
   public static TableState getTableState(Connection conn, TableName tableName)
     throws IOException {
     if (tableName.equals(TableName.META_TABLE_NAME)) {
@@ -489,7 +486,6 @@ public final class HBCKMetaTableAccessor {
    * @param qualifier Column family qualifier
    * @return An RegionInfo instance or null.
    */
-  @Nullable
   public static RegionInfo getRegionInfo(final Result r, byte [] qualifier) {
     Cell cell = r.getColumnLatestCell(CATALOG_FAMILY, qualifier);
     if (cell == null) {
@@ -538,7 +534,6 @@ public final class HBCKMetaTableAccessor {
    * @param r Result to pull from
    * @return A ServerName instance or null if necessary fields not found or empty.
    */
-  @Nullable
   @InterfaceAudience.Private // for use by HMaster#getTableRegionRow which is used for testing only
   public static ServerName getServerName(final Result r, final int replicaId) {
     byte[] serverColumn = getServerColumn(replicaId);
@@ -568,7 +563,6 @@ public final class HBCKMetaTableAccessor {
    * @return an HRegionLocationList containing all locations for the region range or null if
    *   we can't deserialize the result.
    */
-  @Nullable
   public static RegionLocations getRegionLocations(final Result r) {
     if (r == null) {
       return null;
diff --git a/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsck.java b/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsck.java
index 7cda06b..6313b85 100644
--- a/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsck.java
+++ b/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsck.java
@@ -126,19 +126,8 @@ import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;
 import org.apache.hadoop.hbase.replication.ReplicationQueueStorage;
 import org.apache.hadoop.hbase.replication.ReplicationStorageFactory;
 import org.apache.hadoop.hbase.security.UserProvider;
-import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.*;
 import org.apache.hadoop.hbase.util.Bytes.ByteArrayComparator;
-import org.apache.hadoop.hbase.util.FSTableDescriptors;
-import org.apache.hadoop.hbase.util.FSUtils;
-import org.apache.hadoop.hbase.util.HFileArchiveUtil;
-import org.apache.hadoop.hbase.util.KeyRange;
-import org.apache.hadoop.hbase.util.Pair;
-import org.apache.hadoop.hbase.util.PairOfSameType;
-import org.apache.hadoop.hbase.util.RegionSplitCalculator;
-import org.apache.hadoop.hbase.util.RetryCounter;
-import org.apache.hadoop.hbase.util.RetryCounterFactory;
-import org.apache.hadoop.hbase.util.Threads;
-import org.apache.hadoop.hbase.util.VersionInfo;
 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
 import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
 import org.apache.hadoop.hbase.zookeeper.ZNodePaths;
@@ -432,7 +421,7 @@ public class HBaseFsck extends Configured implements Closeable {
    */
   @VisibleForTesting
   public static Path getTmpDir(Configuration conf) throws IOException {
-    return new Path(FSUtils.getRootDir(conf), HConstants.HBASE_TEMP_DIRECTORY);
+    return new Path(CommonFSUtils.getRootDir(conf), HConstants.HBASE_TEMP_DIRECTORY);
   }
 
   /**
@@ -464,8 +453,8 @@ public class HBaseFsck extends Configured implements Closeable {
     @Override
     public FSDataOutputStream call() throws IOException {
       try {
-        FileSystem fs = FSUtils.getCurrentFileSystem(this.conf);
-        FsPermission defaultPerms = FSUtils.getFilePermissions(fs, this.conf,
+        FileSystem fs = CommonFSUtils.getCurrentFileSystem(this.conf);
+        FsPermission defaultPerms = CommonFSUtils.getFilePermissions(fs, this.conf,
             HConstants.DATA_FILE_UMASK_KEY);
         Path tmpDir = getTmpDir(conf);
         this.hbckLockPath = new Path(tmpDir, this.lockFileName);
@@ -493,7 +482,7 @@ public class HBaseFsck extends Configured implements Closeable {
       IOException exception = null;
       do {
         try {
-          return FSUtils.create(fs, hbckLockFilePath, defaultPerms, false);
+          return CommonFSUtils.create(fs, hbckLockFilePath, defaultPerms, false);
         } catch (IOException ioe) {
           LOG.info("Failed to create lock file " + hbckLockFilePath.getName()
               + ", try=" + (retryCounter.getAttemptTimes() + 1) + " of "
@@ -558,7 +547,7 @@ public class HBaseFsck extends Configured implements Closeable {
       do {
         try {
           IOUtils.closeQuietly(hbckOutFd);
-          FSUtils.delete(FSUtils.getCurrentFileSystem(getConf()), hbckLockPath, true);
+          CommonFSUtils.delete(CommonFSUtils.getCurrentFileSystem(getConf()), hbckLockPath, true);
           return;
         } catch (IOException ioe) {
           LOG.info("Failed to delete " + hbckLockPath + ", try="
@@ -943,9 +932,9 @@ public class HBaseFsck extends Configured implements Closeable {
       List<RegionInfo> regions = HBCKMetaTableAccessor.getAllRegions(connection);
       final RegionBoundariesInformation currentRegionBoundariesInformation =
           new RegionBoundariesInformation();
-      Path hbaseRoot = FSUtils.getRootDir(getConf());
+      Path hbaseRoot = CommonFSUtils.getRootDir(getConf());
       for (RegionInfo regionInfo : regions) {
-        Path tableDir = FSUtils.getTableDir(hbaseRoot, regionInfo.getTable());
+        Path tableDir = CommonFSUtils.getTableDir(hbaseRoot, regionInfo.getTable());
         currentRegionBoundariesInformation.regionName = regionInfo.getRegionName();
         // For each region, get the start and stop key from the META and compare them to the
         // same information from the Stores.
@@ -1072,7 +1061,6 @@ public class HBaseFsck extends Configured implements Closeable {
         try {
           hf = HFile.createReader(fs, hfile.getPath(), CacheConfig.DISABLED,
               true, getConf());
-          hf.loadFileInfo();
           Optional<Cell> startKv = hf.getFirstKey();
           start = CellUtil.cloneRow(startKv.get());
           Optional<Cell> endKv = hf.getLastKey();
@@ -1187,7 +1175,7 @@ public class HBaseFsck extends Configured implements Closeable {
   private void offlineReferenceFileRepair() throws IOException, InterruptedException {
     clearState();
     Configuration conf = getConf();
-    Path hbaseRoot = FSUtils.getRootDir(conf);
+    Path hbaseRoot = CommonFSUtils.getRootDir(conf);
     FileSystem fs = hbaseRoot.getFileSystem(conf);
     Map<String, Path> allFiles =
       getTableStoreFilePathMap(fs, hbaseRoot, new FSUtils.ReferenceFileFilter(fs), executor);
@@ -1265,7 +1253,7 @@ public class HBaseFsck extends Configured implements Closeable {
 
     // only include the directory paths to tables
     for (Path tableDir : FSUtils.getTableDirs(fs, hbaseRootDir)) {
-      getTableStoreFilePathMap(map, fs, hbaseRootDir, FSUtils.getTableName(tableDir),
+      getTableStoreFilePathMap(map, fs, hbaseRootDir, CommonFSUtils.getTableName(tableDir),
           sfFilter, executor);
     }
     return map;
@@ -1306,7 +1294,7 @@ public class HBaseFsck extends Configured implements Closeable {
         resultMap == null ? new ConcurrentHashMap<>(128, 0.75f, 32) : resultMap;
 
     // only include the directory paths to tables
-    Path tableDir = FSUtils.getTableDir(hbaseRootDir, tableName);
+    Path tableDir = CommonFSUtils.getTableDir(hbaseRootDir, tableName);
     // Inside a table, there are compaction.dir directories to skip.  Otherwise, all else
     // should be regions.
     final FSUtils.FamilyDirFilter familyFilter = new FSUtils.FamilyDirFilter(fs);
@@ -1412,7 +1400,7 @@ public class HBaseFsck extends Configured implements Closeable {
    */
   private void offlineHLinkFileRepair() throws IOException, InterruptedException {
     Configuration conf = getConf();
-    Path hbaseRoot = FSUtils.getRootDir(conf);
+    Path hbaseRoot = CommonFSUtils.getRootDir(conf);
     FileSystem fs = hbaseRoot.getFileSystem(conf);
     Map<String, Path> allFiles = getTableStoreFilePathMap(fs, hbaseRoot,
         new FSUtils.HFileLinkFilter(), executor);
@@ -1586,7 +1574,7 @@ public class HBaseFsck extends Configured implements Closeable {
       }
     }
 
-    Path hbaseRoot = FSUtils.getRootDir(getConf());
+    Path hbaseRoot = CommonFSUtils.getRootDir(getConf());
     FileSystem fs = hbaseRoot.getFileSystem(getConf());
     // serialized table info gathering.
     for (HbckInfo hbi: hbckInfos) {
@@ -1927,7 +1915,7 @@ public class HBaseFsck extends Configured implements Closeable {
       HBaseTestingUtility.closeRegionAndWAL(meta);
       // Clean out the WAL we created and used here.
       LOG.info("Deleting {}, result={}", waldir,
-          FSUtils.delete(FileSystem.get(getConf()), waldir, true));
+          CommonFSUtils.delete(FileSystem.get(getConf()), waldir, true));
     }
     LOG.info("Success! hbase:meta table rebuilt. Old hbase:meta moved into " + backupDir);
     return true;
@@ -1939,7 +1927,7 @@ public class HBaseFsck extends Configured implements Closeable {
    * @return an open hbase:meta HRegion
    */
   private HRegion createNewMeta() throws IOException {
-    Path rootdir = FSUtils.getRootDir(getConf());
+    Path rootdir = CommonFSUtils.getRootDir(getConf());
     RegionInfo ri = RegionInfoBuilder.FIRST_META_REGIONINFO;
     TableDescriptor td = new FSTableDescriptors(getConf()).get(TableName.META_TABLE_NAME);
     return HBaseTestingUtility.createRegionAndWAL(ri, rootdir, getConf(), td);
@@ -1979,7 +1967,7 @@ public class HBaseFsck extends Configured implements Closeable {
 
   private Path getSidelineDir() throws IOException {
     if (sidelineDir == null) {
-      Path hbaseDir = FSUtils.getRootDir(getConf());
+      Path hbaseDir = CommonFSUtils.getRootDir(getConf());
       Path hbckDir = new Path(hbaseDir, HConstants.HBCK_SIDELINEDIR_NAME);
       sidelineDir = new Path(hbckDir, hbaseDir.getName() + "-"
           + startMillis);
@@ -2016,7 +2004,7 @@ public class HBaseFsck extends Configured implements Closeable {
     if (parentDir != null) {
       rootDir = new Path(rootDir, parentDir);
     }
-    Path sidelineTableDir= FSUtils.getTableDir(rootDir, tableName);
+    Path sidelineTableDir= CommonFSUtils.getTableDir(rootDir, tableName);
     Path sidelineRegionDir = new Path(sidelineTableDir, regionDir.getName());
     fs.mkdirs(sidelineRegionDir);
     boolean success = false;
@@ -2077,9 +2065,9 @@ public class HBaseFsck extends Configured implements Closeable {
    */
   void sidelineTable(FileSystem fs, TableName tableName, Path hbaseDir,
       Path backupHbaseDir) throws IOException {
-    Path tableDir = FSUtils.getTableDir(hbaseDir, tableName);
+    Path tableDir = CommonFSUtils.getTableDir(hbaseDir, tableName);
     if (fs.exists(tableDir)) {
-      Path backupTableDir= FSUtils.getTableDir(backupHbaseDir, tableName);
+      Path backupTableDir= CommonFSUtils.getTableDir(backupHbaseDir, tableName);
       fs.mkdirs(backupTableDir.getParent());
       boolean success = fs.rename(tableDir, backupTableDir);
       if (!success) {
@@ -2096,7 +2084,7 @@ public class HBaseFsck extends Configured implements Closeable {
    */
   Path sidelineOldMeta() throws IOException {
     // put current hbase:meta aside.
-    Path hbaseDir = FSUtils.getRootDir(getConf());
+    Path hbaseDir = CommonFSUtils.getRootDir(getConf());
     FileSystem fs = hbaseDir.getFileSystem(getConf());
     Path backupDir = getSidelineDir();
     fs.mkdirs(backupDir);
@@ -2157,7 +2145,7 @@ public class HBaseFsck extends Configured implements Closeable {
    * regionInfoMap
    */
   public void loadHdfsRegionDirs() throws IOException, InterruptedException {
-    Path rootDir = FSUtils.getRootDir(getConf());
+    Path rootDir = CommonFSUtils.getRootDir(getConf());
     FileSystem fs = rootDir.getFileSystem(getConf());
 
     // List all tables from HDFS
@@ -2165,7 +2153,7 @@ public class HBaseFsck extends Configured implements Closeable {
 
     List<Path> paths = FSUtils.getTableDirs(fs, rootDir);
     for (Path path : paths) {
-      TableName tableName = FSUtils.getTableName(path);
+      TableName tableName = CommonFSUtils.getTableName(path);
       if ((!checkMetaOnly && isTableIncluded(tableName)) ||
           tableName.equals(TableName.META_TABLE_NAME)) {
         tableDirs.add(fs.getFileStatus(path));
@@ -2455,7 +2443,7 @@ public class HBaseFsck extends Configured implements Closeable {
       return;
     }
 
-    Path hbaseDir = FSUtils.getRootDir(getConf());
+    Path hbaseDir = CommonFSUtils.getRootDir(getConf());
     FileSystem fs = hbaseDir.getFileSystem(getConf());
     UserProvider userProvider = UserProvider.instantiate(getConf());
     UserGroupInformation ugi = userProvider.getCurrent().getUGI();
@@ -4270,7 +4258,7 @@ public class HBaseFsck extends Configured implements Closeable {
         // we are only guaranteed to have a path and not an HRI for hdfsEntry,
         // so we get the name from the Path
         Path tableDir = this.hdfsEntry.hdfsRegionDir.getParent();
-        return FSUtils.getTableName(tableDir);
+        return CommonFSUtils.getTableName(tableDir);
       } else {
         // return the info from the first online/deployed hri
         for (OnlineEntry e : deployedEntries) {
@@ -5435,13 +5423,13 @@ public class HBaseFsck extends Configured implements Closeable {
         setHFileCorruptionChecker(hfcc); // so we can get result
         Collection<TableName> tables = getIncludedTables();
         Collection<Path> tableDirs = new ArrayList<>();
-        Path rootdir = FSUtils.getRootDir(getConf());
+        Path rootdir = CommonFSUtils.getRootDir(getConf());
         if (tables.size() > 0) {
           for (TableName t : tables) {
-            tableDirs.add(FSUtils.getTableDir(rootdir, t));
+            tableDirs.add(CommonFSUtils.getTableDir(rootdir, t));
           }
         } else {
-          tableDirs = FSUtils.getTableDirs(FSUtils.getCurrentFileSystem(getConf()), rootdir);
+          tableDirs = FSUtils.getTableDirs(CommonFSUtils.getCurrentFileSystem(getConf()), rootdir);
         }
         hfcc.checkTables(tableDirs);
         hfcc.report(errors);
diff --git a/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsckRepair.java b/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsckRepair.java
index e9207c9..b2cc879 100644
--- a/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsckRepair.java
+++ b/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsckRepair.java
@@ -41,6 +41,7 @@ import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.master.RegionState;
 import org.apache.hadoop.hbase.master.ServerManager;
 import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hbase.HBCKMetaTableAccessor;
 import org.apache.zookeeper.KeeperException;
@@ -187,7 +188,7 @@ public final class HBaseFsckRepair {
   public static HRegion createHDFSRegionDir(Configuration conf,
       RegionInfo hri, TableDescriptor htd) throws IOException {
     // Create HRegion
-    Path root = FSUtils.getRootDir(conf);
+    Path root = CommonFSUtils.getRootDir(conf);
     HRegion region = HRegion.createHRegion(hri, root, conf, htd, null);
 
     // Close the new region to flush to disk. Close log file too.
diff --git a/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HFileCorruptionChecker.java b/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HFileCorruptionChecker.java
index a0d530d..e93bae7 100644
--- a/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HFileCorruptionChecker.java
+++ b/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HFileCorruptionChecker.java
@@ -41,6 +41,7 @@ import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.io.hfile.CorruptHFileException;
 import org.apache.hadoop.hbase.io.hfile.HFile;
 import org.apache.hadoop.hbase.mob.MobUtils;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hadoop.hbase.util.FSUtils.FamilyDirFilter;
 import org.apache.hadoop.hbase.util.FSUtils.HFileFilter;
@@ -144,7 +145,7 @@ public class HFileCorruptionChecker {
     Path tableDir = regionDir.getParent();
 
     // build up the corrupted dirs structure
-    Path corruptBaseDir = new Path(FSUtils.getRootDir(conf), HConstants.CORRUPT_DIR_NAME);
+    Path corruptBaseDir = new Path(CommonFSUtils.getRootDir(conf), HConstants.CORRUPT_DIR_NAME);
     if (conf.get("hbase.hfile.quarantine.dir") != null) {
       LOG.warn("hbase.hfile.quarantine.dir is deprecated. Default to " + corruptBaseDir);
     }
@@ -418,7 +419,7 @@ public class HFileCorruptionChecker {
    * @return An instance of MobRegionDirChecker.
    */
   private MobRegionDirChecker createMobRegionDirChecker(Path tableDir) {
-    TableName tableName = FSUtils.getTableName(tableDir);
+    TableName tableName = CommonFSUtils.getTableName(tableDir);
     Path mobDir = MobUtils.getMobRegionPath(conf, tableName);
     return new MobRegionDirChecker(mobDir);
   }
diff --git a/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/OfflineMetaRepair.java b/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/OfflineMetaRepair.java
index 2af2fce..e2bce8c 100644
--- a/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/OfflineMetaRepair.java
+++ b/hbase-hbck2/src/main/java/org/apache/hbase/hbck1/OfflineMetaRepair.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hadoop.io.MultipleIOException;
 
@@ -70,7 +71,7 @@ public final class OfflineMetaRepair {
     Configuration conf = HBaseConfiguration.create();
     // Cover both bases, the old way of setting default fs and the new.
     // We're supposed to run on 0.20 and 0.21 anyways.
-    FSUtils.setFsDefault(conf, FSUtils.getRootDir(conf));
+    CommonFSUtils.setFsDefault(conf, CommonFSUtils.getRootDir(conf));
     HBaseFsck fsck = new HBaseFsck(conf);
 
     // Process command-line args.
@@ -85,8 +86,8 @@ public final class OfflineMetaRepair {
         }
         // update hbase root dir to user-specified base
         i++;
-        FSUtils.setRootDir(conf, new Path(args[i]));
-        FSUtils.setFsDefault(conf, FSUtils.getRootDir(conf));
+        CommonFSUtils.setRootDir(conf, new Path(args[i]));
+        CommonFSUtils.setFsDefault(conf, CommonFSUtils.getRootDir(conf));
       } else if (cmd.equals("-sidelineDir")) {
         if (i == args.length - 1) {
           System.err.println("OfflineMetaRepair: -sidelineDir needs an HDFS path.");
diff --git a/hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java b/hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java
index ca3caca..1e8ba04 100644
--- a/hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java
+++ b/hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java
@@ -51,6 +51,7 @@ import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.client.TableState;
 import org.apache.hadoop.hbase.master.RegionState;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hadoop.hbase.util.Threads;
 
@@ -409,7 +410,7 @@ public class TestHBCK2 {
 
   private void deleteRegionDir(TableName tableName, String regionEncodedName) {
     try {
-      Path tableDir = FSUtils.getTableDir(this.TEST_UTIL.getDataTestDirOnTestFS(), tableName);
+      Path tableDir = CommonFSUtils.getTableDir(this.TEST_UTIL.getDataTestDirOnTestFS(), tableName);
       Path regionPath = new Path(tableDir, regionEncodedName);
       this.TEST_UTIL.getTestFileSystem().delete(regionPath, true);
     } catch (IOException e) {
diff --git a/hbase-hbck2/src/test/java/org/apache/hbase/TestSchedulingRecoveries.java b/hbase-hbck2/src/test/java/org/apache/hbase/TestSchedulingRecoveries.java
index f238c7f..b9ea9bd 100644
--- a/hbase-hbck2/src/test/java/org/apache/hbase/TestSchedulingRecoveries.java
+++ b/hbase-hbck2/src/test/java/org/apache/hbase/TestSchedulingRecoveries.java
@@ -26,10 +26,7 @@ import java.util.List;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.client.ClusterConnection;
 import org.apache.hadoop.hbase.client.Hbck;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.*;
 
 import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
 
@@ -63,21 +60,4 @@ public class TestSchedulingRecoveries {
       assertTrue(pids.get(1) > 0);
     }
   }
-
-  @Test
-  public void testSchedulingSCPWithBadHost() {
-    boolean thrown = false;
-    try {
-      try (ClusterConnection connection = this.hbck2.connect(); Hbck hbck = connection.getHbck()) {
-        this.hbck2.scheduleRecoveries(hbck, new String[]{"a.example.org,1,2"});
-      }
-    } catch (IOException ioe) {
-      thrown = true;
-      // Throws a weird exception complaining about FileNotFoundException down inside
-      // a RemoteWithExtras... wrapped in a ServiceException. Check for latter. This
-      // won't change.
-      assertTrue(ioe.getCause() instanceof ServiceException);
-    }
-    assertTrue(thrown);
-  }
 }
diff --git a/hbase-tools/src/test/java/org/apache/hbase/TestRegionsMerger.java b/hbase-tools/src/test/java/org/apache/hbase/TestRegionsMerger.java
index ec43bfc..f6939b0 100644
--- a/hbase-tools/src/test/java/org/apache/hbase/TestRegionsMerger.java
+++ b/hbase-tools/src/test/java/org/apache/hbase/TestRegionsMerger.java
@@ -29,11 +29,7 @@ import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.*;
 
 
 public class TestRegionsMerger {
@@ -71,9 +67,13 @@ public class TestRegionsMerger {
     final int originalCount = TEST_UTIL.countRows(table);
     TEST_UTIL.getConfiguration().setInt(RegionsMerger.MAX_ROUNDS_IDLE, 10);
     RegionsMerger merger = new RegionsMerger(TEST_UTIL.getConfiguration());
-    merger.mergeRegions(TABLE_NAME.getNameWithNamespaceInclAsString(), 3);
+    // hbase-2.3 and hbase-2.1 merge's work differently; 2.3 won't merge if a merge candidate is a parent.
+    // The below used to merge until only 3 regions. Made it less aggressive. Originally there are 15 regions.
+    // Merge till 10.
+    final int target = 10;
+    merger.mergeRegions(TABLE_NAME.getNameWithNamespaceInclAsString(), target);
     List<RegionInfo> result = TEST_UTIL.getAdmin().getRegions(TABLE_NAME);
-    assertEquals(3, result.size());
+    assertEquals(target, result.size());
     assertEquals("Row count before and after merge should be equal",
         originalCount, TEST_UTIL.countRows(table));
   }