diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java
index 808068cfa5c..dc737b96aa4 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/HBaseFsck.java
@@ -150,6 +150,9 @@ public class HBaseFsck {
private static final int DEFAULT_OVERLAPS_TO_SIDELINE = 2;
private static final int DEFAULT_MAX_MERGE = 5;
+ private static final String DEFAULT_SIDELINE_DIR = ".hbcktmp-" +
+ System.currentTimeMillis();
+
/**********************
* Internal resources
**********************/
@@ -160,7 +163,6 @@ public class HBaseFsck {
private HBaseAdmin admin;
private HTable meta;
private ScheduledThreadPoolExecutor executor; // threads to retrieve data from regionservers
- private long startMillis = System.currentTimeMillis();
/***********
* Options
@@ -181,6 +183,7 @@ public class HBaseFsck {
private int maxMerge = DEFAULT_MAX_MERGE; // maximum number of overlapping regions to merge
private int maxOverlapsToSideline = DEFAULT_OVERLAPS_TO_SIDELINE; // maximum number of overlapping regions to sideline
private boolean sidelineBigOverlaps = false; // sideline overlaps with >maxMerge regions
+ private Path sidelineDir = null;
private boolean rerun = false; // if we tried to fix something, rerun hbck
private static boolean summary = false; // if we want to print less output
@@ -817,7 +820,7 @@ public class HBaseFsck {
// we can rebuild, move old root and meta out of the way and start
LOG.info("HDFS regioninfo's seems good. Sidelining old .META.");
- sidelineOldRootAndMeta();
+ Path backupDir = sidelineOldRootAndMeta();
LOG.info("Creating new .META.");
HRegion meta = createNewRootAndMeta();
@@ -832,6 +835,7 @@ public class HBaseFsck {
meta.put(puts.toArray(new Put[0]));
HRegion.closeHRegion(meta);
LOG.info("Success! .META. table rebuilt.");
+ LOG.info("Old -ROOT- and .META. are moved into " + backupDir);
return true;
}
@@ -855,11 +859,11 @@ public class HBaseFsck {
}
private Path getSidelineDir() throws IOException {
- Path hbaseDir = FSUtils.getRootDir(conf);
- Path hbckDir = new Path(hbaseDir.getParent(), "hbck");
- Path backupDir = new Path(hbckDir, hbaseDir.getName() + "-"
- + startMillis);
- return backupDir;
+ if (sidelineDir == null) {
+ Path hbaseDir = FSUtils.getRootDir(conf);
+ sidelineDir = new Path(hbaseDir, DEFAULT_SIDELINE_DIR);
+ }
+ return sidelineDir;
}
/**
@@ -957,8 +961,7 @@ public class HBaseFsck {
// put current -ROOT- and .META. aside.
Path hbaseDir = new Path(conf.get(HConstants.HBASE_DIR));
FileSystem fs = hbaseDir.getFileSystem(conf);
- Path backupDir = new Path(hbaseDir.getParent(), hbaseDir.getName() + "-"
- + startMillis);
+ Path backupDir = getSidelineDir();
fs.mkdirs(backupDir);
sidelineTable(fs, HConstants.ROOT_TABLE_NAME, hbaseDir, backupDir);
@@ -2986,6 +2989,14 @@ public class HBaseFsck {
timelag = seconds * 1000; // convert to milliseconds
}
+ /**
+ *
+ * @param sidelineDir - HDFS path to sideline data
+ */
+ public void setSidelineDir(String sidelineDir) {
+ this.sidelineDir = new Path(sidelineDir);
+ }
+
protected static void printUsageAndExit() {
System.err.println("Usage: fsck [opts] {only tables}");
System.err.println(" where [opts] are:");
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/hbck/OfflineMetaRepair.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/hbck/OfflineMetaRepair.java
index 8dc72f3ae2b..b118287c9c8 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/hbck/OfflineMetaRepair.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/hbck/OfflineMetaRepair.java
@@ -51,6 +51,8 @@ public class OfflineMetaRepair {
System.err
.println(" -details Display full report of all regions.");
System.err.println(" -base Base Hbase Data directory");
+ System.err
+ .println(" -sidelineDir HDFS path to backup existing meta and root.");
System.err.println(" -fix Auto fix as many problems as possible");
System.err.println(" -fixHoles Auto fix as region holes");
Runtime.getRuntime().exit(-2);
@@ -85,6 +87,9 @@ public class OfflineMetaRepair {
conf.set(HConstants.HBASE_DIR, path);
conf.set("fs.defaultFS", conf.get(HConstants.HBASE_DIR));
conf.set("fs.default.name", conf.get(HConstants.HBASE_DIR));
+ } else if (cmd.equals("-sidelineDir")) {
+ i++;
+ fsck.setSidelineDir(args[i]);
} else if (cmd.equals("-fixHoles")) {
fixHoles = true;
} else if (cmd.equals("-fix")) {