You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/03/11 14:54:01 UTC

[01/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 144e324ee -> 89e23f785


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html
index e82daed..478e1af 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html
@@ -39,299 +39,323 @@
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.TableName;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.backup.impl.BackupAdminImpl;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceHFileSplitterJob;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Table;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.junit.Assert;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.junit.ClassRule;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.junit.Test;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.junit.experimental.categories.Category;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.slf4j.Logger;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.slf4j.LoggerFactory;<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>@Category(LargeTests.class)<a name="line.54"></a>
-<span class="sourceLineNo">055</span>public class TestIncrementalBackupMergeWithFailures extends TestBackupBase {<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>  @ClassRule<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      HBaseClassTestRule.forClass(TestIncrementalBackupMergeWithFailures.class);<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static final Logger LOG =<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      LoggerFactory.getLogger(TestIncrementalBackupMergeWithFailures.class);<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  enum FailurePhase {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    PHASE1, PHASE2, PHASE3, PHASE4<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public final static String FAILURE_PHASE_KEY = "failurePhase";<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  static class BackupMergeJobWithFailures extends MapReduceBackupMergeJob {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    FailurePhase failurePhase;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>    @Override<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    public void setConf(Configuration conf) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      super.setConf(conf);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      String val = conf.get(FAILURE_PHASE_KEY);<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      if (val != null) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        failurePhase = FailurePhase.valueOf(val);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      } else {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        Assert.fail("Failure phase is not set");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      }<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>    /**<a name="line.84"></a>
-<span class="sourceLineNo">085</span>     * This is the exact copy of parent's run() with injections<a name="line.85"></a>
-<span class="sourceLineNo">086</span>     * of different types of failures<a name="line.86"></a>
-<span class="sourceLineNo">087</span>     */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    @Override<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    public void run(String[] backupIds) throws IOException {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      String bulkOutputConfKey;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>      // TODO : run player on remote cluster<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      player = new MapReduceHFileSplitterJob();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      bulkOutputConfKey = MapReduceHFileSplitterJob.BULK_OUTPUT_CONF_KEY;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      // Player reads all files in arbitrary directory structure and creates<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      // a Map task for each file<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      String bids = StringUtils.join(backupIds, ",");<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>      if (LOG.isDebugEnabled()) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        LOG.debug("Merge backup images " + bids);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>      List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList = new ArrayList&lt;&gt;();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      boolean finishedTables = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      BackupSystemTable table = new BackupSystemTable(conn);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      FileSystem fs = FileSystem.get(getConf());<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>      try {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        // Start backup exclusive operation<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        table.startBackupExclusiveOperation();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        // Start merge operation<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        table.startMergeOperation(backupIds);<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>        // Select most recent backup id<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        String mergedBackupId = findMostRecentBackupId(backupIds);<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>        TableName[] tableNames = getTableNamesInBackupImages(backupIds);<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>        BackupInfo bInfo = table.readBackupInfo(backupIds[0]);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        String backupRoot = bInfo.getBackupRootDir();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        // PHASE 1<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        checkFailure(FailurePhase.PHASE1);<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>        for (int i = 0; i &lt; tableNames.length; i++) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>          LOG.info("Merge backup images for " + tableNames[i]);<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>          // Find input directories for table<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          Path[] dirPaths = findInputDirectories(fs, backupRoot, tableNames[i], backupIds);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>          String dirs = StringUtils.join(dirPaths, ",");<a name="line.130"></a>
-<span class="sourceLineNo">131</span>          Path bulkOutputPath =<a name="line.131"></a>
-<span class="sourceLineNo">132</span>              BackupUtils.getBulkOutputDir(BackupUtils.getFileNameCompatibleString(tableNames[i]),<a name="line.132"></a>
-<span class="sourceLineNo">133</span>                getConf(), false);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>          // Delete content if exists<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          if (fs.exists(bulkOutputPath)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            if (!fs.delete(bulkOutputPath, true)) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>              LOG.warn("Can not delete: " + bulkOutputPath);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>            }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          Configuration conf = getConf();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          conf.set(bulkOutputConfKey, bulkOutputPath.toString());<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          String[] playerArgs = { dirs, tableNames[i].getNameAsString() };<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>          // PHASE 2<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          checkFailure(FailurePhase.PHASE2);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          player.setConf(getConf());<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          int result = player.run(playerArgs);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          if (succeeded(result)) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>            // Add to processed table list<a name="line.149"></a>
-<span class="sourceLineNo">150</span>            processedTableList.add(new Pair&lt;&gt;(tableNames[i], bulkOutputPath));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>          } else {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>            throw new IOException("Can not merge backup images for " + dirs<a name="line.152"></a>
-<span class="sourceLineNo">153</span>                + " (check Hadoop/MR and HBase logs). Player return code =" + result);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>          }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          LOG.debug("Merge Job finished:" + result);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        List&lt;TableName&gt; tableList = toTableNameList(processedTableList);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        // PHASE 3<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        checkFailure(FailurePhase.PHASE3);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        table.updateProcessedTablesForMerge(tableList);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        finishedTables = true;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>        // Move data<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        for (Pair&lt;TableName, Path&gt; tn : processedTableList) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          moveData(fs, backupRoot, tn.getSecond(), tn.getFirst(), mergedBackupId);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        // PHASE 4<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        checkFailure(FailurePhase.PHASE4);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        // Delete old data and update manifest<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        List&lt;String&gt; backupsToDelete = getBackupIdsToDelete(backupIds, mergedBackupId);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        deleteBackupImages(backupsToDelete, conn, fs, backupRoot);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        updateBackupManifest(backupRoot, mergedBackupId, backupsToDelete);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        // Finish merge session<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        table.finishMergeOperation();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      } catch (RuntimeException e) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        throw e;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      } catch (Exception e) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        LOG.error(e.toString(), e);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (!finishedTables) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>          // cleanup bulk directories and finish merge<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          // merge MUST be repeated (no need for repair)<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          cleanupBulkLoadDirs(fs, toPathList(processedTableList));<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          table.finishMergeOperation();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          table.finishBackupExclusiveOperation();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          throw new IOException("Backup merge operation failed, you should try it again", e);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        } else {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>          // backup repair must be run<a name="line.187"></a>
-<span class="sourceLineNo">188</span>          throw new IOException(<a name="line.188"></a>
-<span class="sourceLineNo">189</span>              "Backup merge operation failed, run backup repair tool to restore system's integrity",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>              e);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      } finally {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        table.close();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        conn.close();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>    private void checkFailure(FailurePhase phase) throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      if (failurePhase != null &amp;&amp; failurePhase == phase) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        throw new IOException(phase.toString());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public void TestIncBackupMergeRestore() throws Exception {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    int ADD_ROWS = 99;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // #1 - create full backup for all tables<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    LOG.info("create full backup image for all tables");<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1, table2);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    // Set custom Merge Job implementation<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    conf1.setClass(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      BackupMergeJobWithFailures.class, BackupMergeJob.class);<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    String backupIdFull = client.backupTables(request);<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.224"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.backup.impl.BackupCommands;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceHFileSplitterJob;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Table;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.junit.Assert;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.junit.ClassRule;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.junit.Test;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.junit.experimental.categories.Category;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.slf4j.Logger;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.slf4j.LoggerFactory;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>@Category(LargeTests.class)<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public class TestIncrementalBackupMergeWithFailures extends TestBackupBase {<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  @ClassRule<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      HBaseClassTestRule.forClass(TestIncrementalBackupMergeWithFailures.class);<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final Logger LOG =<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      LoggerFactory.getLogger(TestIncrementalBackupMergeWithFailures.class);<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  enum FailurePhase {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    PHASE1, PHASE2, PHASE3, PHASE4<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  }<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public final static String FAILURE_PHASE_KEY = "failurePhase";<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  static class BackupMergeJobWithFailures extends MapReduceBackupMergeJob {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    FailurePhase failurePhase;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>    @Override<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    public void setConf(Configuration conf) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      super.setConf(conf);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      String val = conf.get(FAILURE_PHASE_KEY);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      if (val != null) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        failurePhase = FailurePhase.valueOf(val);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      } else {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        Assert.fail("Failure phase is not set");<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>    /**<a name="line.85"></a>
+<span class="sourceLineNo">086</span>     * This is the exact copy of parent's run() with injections<a name="line.86"></a>
+<span class="sourceLineNo">087</span>     * of different types of failures<a name="line.87"></a>
+<span class="sourceLineNo">088</span>     */<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    @Override<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void run(String[] backupIds) throws IOException {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      String bulkOutputConfKey;<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>      // TODO : run player on remote cluster<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      player = new MapReduceHFileSplitterJob();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      bulkOutputConfKey = MapReduceHFileSplitterJob.BULK_OUTPUT_CONF_KEY;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      // Player reads all files in arbitrary directory structure and creates<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      // a Map task for each file<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      String bids = StringUtils.join(backupIds, ",");<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>      if (LOG.isDebugEnabled()) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        LOG.debug("Merge backup images " + bids);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>      List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList = new ArrayList&lt;&gt;();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      boolean finishedTables = false;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      BackupSystemTable table = new BackupSystemTable(conn);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      FileSystem fs = FileSystem.get(getConf());<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>      try {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        // Start backup exclusive operation<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        table.startBackupExclusiveOperation();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        // Start merge operation<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        table.startMergeOperation(backupIds);<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>        // Select most recent backup id<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>        TableName[] tableNames = getTableNamesInBackupImages(backupIds);<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>        BackupInfo bInfo = table.readBackupInfo(backupIds[0]);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        String backupRoot = bInfo.getBackupRootDir();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        // PHASE 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        checkFailure(FailurePhase.PHASE1);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>        for (int i = 0; i &lt; tableNames.length; i++) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>          LOG.info("Merge backup images for " + tableNames[i]);<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>          // Find input directories for table<a name="line.129"></a>
+<span class="sourceLineNo">130</span>          Path[] dirPaths = findInputDirectories(fs, backupRoot, tableNames[i], backupIds);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          String dirs = StringUtils.join(dirPaths, ",");<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          Path bulkOutputPath =<a name="line.132"></a>
+<span class="sourceLineNo">133</span>              BackupUtils.getBulkOutputDir(BackupUtils.getFileNameCompatibleString(tableNames[i]),<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                getConf(), false);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>          // Delete content if exists<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          if (fs.exists(bulkOutputPath)) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>            if (!fs.delete(bulkOutputPath, true)) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>              LOG.warn("Can not delete: " + bulkOutputPath);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>            }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>          }<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          Configuration conf = getConf();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          conf.set(bulkOutputConfKey, bulkOutputPath.toString());<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          String[] playerArgs = { dirs, tableNames[i].getNameAsString() };<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>          // PHASE 2<a name="line.145"></a>
+<span class="sourceLineNo">146</span>          checkFailure(FailurePhase.PHASE2);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          player.setConf(getConf());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          int result = player.run(playerArgs);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          if (succeeded(result)) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            // Add to processed table list<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            processedTableList.add(new Pair&lt;&gt;(tableNames[i], bulkOutputPath));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          } else {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>            throw new IOException("Can not merge backup images for " + dirs<a name="line.153"></a>
+<span class="sourceLineNo">154</span>                + " (check Hadoop/MR and HBase logs). Player return code =" + result);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          LOG.debug("Merge Job finished:" + result);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        List&lt;TableName&gt; tableList = toTableNameList(processedTableList);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        // PHASE 3<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        checkFailure(FailurePhase.PHASE3);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        table.updateProcessedTablesForMerge(tableList);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        finishedTables = true;<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>        // (modification of a backup file system)<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        // Move existing mergedBackupId data into tmp directory<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        // we will need it later in case of a failure<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        Path tmpBackupDir =  HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          mergedBackupId);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        Path backupDirPath = HBackupFileSystem.getBackupPath(backupRoot, mergedBackupId);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        if (!fs.rename(backupDirPath, tmpBackupDir)) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          throw new IOException("Failed to rename "+ backupDirPath +" to "+tmpBackupDir);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        } else {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          LOG.debug("Renamed "+ backupDirPath +" to "+ tmpBackupDir);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        // Move new data into backup dest<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        for (Pair&lt;TableName, Path&gt; tn : processedTableList) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          moveData(fs, backupRoot, tn.getSecond(), tn.getFirst(), mergedBackupId);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        }<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        checkFailure(FailurePhase.PHASE4);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        // Update backup manifest<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        List&lt;String&gt; backupsToDelete = getBackupIdsToDelete(backupIds, mergedBackupId);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        updateBackupManifest(tmpBackupDir.getParent().toString(), mergedBackupId, backupsToDelete);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        // Copy meta files back from tmp to backup dir<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        copyMetaData(fs, tmpBackupDir, backupDirPath);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        // Delete tmp dir (Rename back during repair)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        if (!fs.delete(tmpBackupDir, true)) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>          // WARN and ignore<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          LOG.warn("Could not delete tmp dir: "+ tmpBackupDir);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        }<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        // Delete old data<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        deleteBackupImages(backupsToDelete, conn, fs, backupRoot);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        // Finish merge session<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        table.finishMergeOperation();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        // Release lock<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        table.finishBackupExclusiveOperation();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (RuntimeException e) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        throw e;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      } catch (Exception e) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        LOG.error(e.toString(), e);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        if (!finishedTables) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          // cleanup bulk directories and finish merge<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          // merge MUST be repeated (no need for repair)<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          cleanupBulkLoadDirs(fs, toPathList(processedTableList));<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          table.finishMergeOperation();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          table.finishBackupExclusiveOperation();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          throw new IOException("Backup merge operation failed, you should try it again", e);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          // backup repair must be run<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          throw new IOException(<a name="line.209"></a>
+<span class="sourceLineNo">210</span>              "Backup merge operation failed, run backup repair tool to restore system's integrity",<a name="line.210"></a>
+<span class="sourceLineNo">211</span>              e);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      } finally {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        table.close();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        conn.close();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private void checkFailure(FailurePhase phase) throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (failurePhase != null &amp;&amp; failurePhase == phase) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        throw new IOException(phase.toString());<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
 <span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // #2 - insert some data to table1<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    HTable t1 = insertIntoTable(conn, table1, famName, 1, ADD_ROWS);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.debug("writing " + ADD_ROWS + " rows to " + table1);<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    t1.close();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table1);<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    HTable t2 = insertIntoTable(conn, table2, famName, 1, ADD_ROWS);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>    Assert.assertEquals(TEST_UTIL.countRows(t2), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    t2.close();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table2);<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>    // #3 - incremental backup for multiple tables<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    tables = Lists.newArrayList(table1, table2);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.243"></a>
+<span class="sourceLineNo">226</span>  @Test<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  public void TestIncBackupMergeRestore() throws Exception {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    int ADD_ROWS = 99;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    // #1 - create full backup for all tables<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    LOG.info("create full backup image for all tables");<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1, table2);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    // Set custom Merge Job implementation<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    conf1.setClass(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS,<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      BackupMergeJobWithFailures.class, BackupMergeJob.class);<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String backupIdFull = client.backupTables(request);<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.245"></a>
+<span class="sourceLineNo">245</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>    t1 = insertIntoTable(conn, table1, famName, 2, ADD_ROWS);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    t1.close();<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    t2 = insertIntoTable(conn, table2, famName, 2, ADD_ROWS);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    t2.close();<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    // #3 - incremental backup for multiple tables<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    String backupIdIncMultiple2 = client.backupTables(request);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    assertTrue(checkSucceeded(backupIdIncMultiple2));<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        // #4 Merge backup images with failures<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    for (FailurePhase phase : FailurePhase.values()) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      Configuration conf = conn.getConfiguration();<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>      conf.set(FAILURE_PHASE_KEY, phase.toString());<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>      try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        bAdmin.mergeBackups(backups);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        Assert.fail("Expected IOException");<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      } catch (IOException e) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        BackupSystemTable table = new BackupSystemTable(conn);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        if(phase.ordinal() &lt; FailurePhase.PHASE4.ordinal()) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          // No need to repair:<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          // Both Merge and backup exclusive operations are finished<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          assertFalse(table.isMergeInProgress());<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          try {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            table.finishBackupExclusiveOperation();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>            Assert.fail("IOException is expected");<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          } catch(IOException ee) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            // Expected<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        } else {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          // Repair is required<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          assertTrue(table.isMergeInProgress());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>            table.startBackupExclusiveOperation();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            Assert.fail("IOException is expected");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          } catch(IOException ee) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            // Expected - clean up before proceeding<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            table.finishMergeOperation();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            table.finishBackupExclusiveOperation();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        table.close();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        LOG.debug("Expected :"+ e.getMessage());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // Now merge w/o failures<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    Configuration conf = conn.getConfiguration();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    conf.unset(FAILURE_PHASE_KEY);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    conf.unset(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>    try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      bAdmin.mergeBackups(backups);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // #6 - restore incremental backup for multiple tables, with overwrite<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1, table2 };<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    TableName[] tablesMapIncMultiple = new TableName[] { table1_restore, table2_restore };<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple2, false,<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      tablesRestoreIncMultiple, tablesMapIncMultiple, true));<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    Table hTable = conn.getTable(table1_restore);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    LOG.debug("After incremental restore: " + hTable.getTableDescriptor());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    LOG.debug("f1 has " + TEST_UTIL.countRows(hTable, famName) + " rows");<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable, famName), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>    hTable.close();<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    hTable = conn.getTable(table2_restore);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    hTable.close();<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>    admin.close();<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    conn.close();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>}<a name="line.326"></a>
+<span class="sourceLineNo">247</span>    // #2 - insert some data to table1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HTable t1 = insertIntoTable(conn, table1, famName, 1, ADD_ROWS);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    LOG.debug("writing " + ADD_ROWS + " rows to " + table1);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    t1.close();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table1);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    HTable t2 = insertIntoTable(conn, table2, famName, 1, ADD_ROWS);<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    Assert.assertEquals(TEST_UTIL.countRows(t2), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    t2.close();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table2);<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // #3 - incremental backup for multiple tables<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    tables = Lists.newArrayList(table1, table2);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    t1 = insertIntoTable(conn, table1, famName, 2, ADD_ROWS);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    t1.close();<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>    t2 = insertIntoTable(conn, table2, famName, 2, ADD_ROWS);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    t2.close();<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    // #3 - incremental backup for multiple tables<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    String backupIdIncMultiple2 = client.backupTables(request);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    assertTrue(checkSucceeded(backupIdIncMultiple2));<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        // #4 Merge backup images with failures<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    for (FailurePhase phase : FailurePhase.values()) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Configuration conf = conn.getConfiguration();<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>      conf.set(FAILURE_PHASE_KEY, phase.toString());<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>      try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        bAdmin.mergeBackups(backups);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        Assert.fail("Expected IOException");<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      } catch (IOException e) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        BackupSystemTable table = new BackupSystemTable(conn);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        if(phase.ordinal() &lt; FailurePhase.PHASE4.ordinal()) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          // No need to repair:<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          // Both Merge and backup exclusive operations are finished<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          assertFalse(table.isMergeInProgress());<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            table.finishBackupExclusiveOperation();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            Assert.fail("IOException is expected");<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          } catch(IOException ee) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            // Expected<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        } else {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          // Repair is required<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          assertTrue(table.isMergeInProgress());<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>            table.startBackupExclusiveOperation();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            Assert.fail("IOException is expected");<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          } catch(IOException ee) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>            // Expected - clean up before proceeding<a name="line.308"></a>
+<span class="sourceLineNo">309</span>            //table.finishMergeOperation();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>            //table.finishBackupExclusiveOperation();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        table.close();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        LOG.debug("Expected :"+ e.getMessage());<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    // Now merge w/o failures<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    Configuration conf = conn.getConfiguration();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    conf.unset(FAILURE_PHASE_KEY);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    conf.unset(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    // Now run repair<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    BackupSystemTable sysTable = new BackupSystemTable(conn);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    BackupCommands.RepairCommand.repairFailedBackupMergeIfAny(conn, sysTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    // Now repeat merge<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      bAdmin.mergeBackups(backups);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    // #6 - restore incremental backup for multiple tables, with overwrite<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1, table2 };<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    TableName[] tablesMapIncMultiple = new TableName[] { table1_restore, table2_restore };<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple2, false,<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      tablesRestoreIncMultiple, tablesMapIncMultiple, true));<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Table hTable = conn.getTable(table1_restore);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    LOG.debug("After incremental restore: " + hTable.getTableDescriptor());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    LOG.debug("f1 has " + TEST_UTIL.countRows(hTable, famName) + " rows");<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable, famName), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>    hTable.close();<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    hTable = conn.getTable(table2_restore);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    hTable.close();<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>    admin.close();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    conn.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>}<a name="line.350"></a>
 
 
 


[16/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.CreateCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.CreateCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.CreateCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.CreateCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.CreateCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[15/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[17/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[13/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[24/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 93af4cf..df208e7 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -274,10 +274,10 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>3577</td>
+<td>3578</td>
 <td>0</td>
 <td>0</td>
-<td>16169</td></tr></table></div>
+<td>16170</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -922,9336 +922,9341 @@
 <td>0</td>
 <td>19</td></tr>
 <tr class="a">
+<td><a href="#org.apache.hadoop.hbase.backup.TestBackupMerge.java">org/apache/hadoop/hbase/backup/TestBackupMerge.java</a></td>
+<td>0</td>
+<td>0</td>
+<td>1</td></tr>
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.backup.TestHFileArchiving.java">org/apache/hadoop/hbase/backup/TestHFileArchiving.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.backup.example.HFileArchiveManager.java">org/apache/hadoop/hbase/backup/example/HFileArchiveManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.backup.example.LongTermArchivingHFileCleaner.java">org/apache/hadoop/hbase/backup/example/LongTermArchivingHFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.backup.example.TableHFileArchiveTracker.java">org/apache/hadoop/hbase/backup/example/TableHFileArchiveTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.backup.example.TestZooKeeperTableArchiveClient.java">org/apache/hadoop/hbase/backup/example/TestZooKeeperTableArchiveClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.backup.example.ZKTableArchiveClient.java">org/apache/hadoop/hbase/backup/example/ZKTableArchiveClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.Action.java">org/apache/hadoop/hbase/chaos/actions/Action.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.ChangeCompressionAction.java">org/apache/hadoop/hbase/chaos/actions/ChangeCompressionAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.ChangeEncodingAction.java">org/apache/hadoop/hbase/chaos/actions/ChangeEncodingAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.ChangeSplitPolicyAction.java">org/apache/hadoop/hbase/chaos/actions/ChangeSplitPolicyAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.ChangeVersionsAction.java">org/apache/hadoop/hbase/chaos/actions/ChangeVersionsAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.RestartRandomDataNodeAction.java">org/apache/hadoop/hbase/chaos/actions/RestartRandomDataNodeAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.RollingBatchRestartRsAction.java">org/apache/hadoop/hbase/chaos/actions/RollingBatchRestartRsAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.SplitAllRegionOfTableAction.java">org/apache/hadoop/hbase/chaos/actions/SplitAllRegionOfTableAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.actions.TruncateTableAction.java">org/apache/hadoop/hbase/chaos/actions/TruncateTableAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MasterKillingMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MasterKillingMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MobNoKillMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MobNoKillMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MobSlowDeterministicMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MobSlowDeterministicMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MonkeyConstants.java">org/apache/hadoop/hbase/chaos/factories/MonkeyConstants.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.MonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/MonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.NoKillMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/NoKillMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.ServerKillingMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/ServerKillingMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.SlowDeterministicMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/SlowDeterministicMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.factories.StressAssignmentManagerMonkeyFactory.java">org/apache/hadoop/hbase/chaos/factories/StressAssignmentManagerMonkeyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.monkies.PolicyBasedChaosMonkey.java">org/apache/hadoop/hbase/chaos/monkies/PolicyBasedChaosMonkey.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.chaos.policies.PeriodicPolicy.java">org/apache/hadoop/hbase/chaos/policies/PeriodicPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.chaos.policies.TwoConcurrentActionPolicy.java">org/apache/hadoop/hbase/chaos/policies/TwoConcurrentActionPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AbstractClientScanner.java">org/apache/hadoop/hbase/client/AbstractClientScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AbstractResponse.java">org/apache/hadoop/hbase/client/AbstractResponse.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Action.java">org/apache/hadoop/hbase/client/Action.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Admin.java">org/apache/hadoop/hbase/client/Admin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Append.java">org/apache/hadoop/hbase/client/Append.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncAdmin.java">org/apache/hadoop/hbase/client/AsyncAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncAdminBuilder.java">org/apache/hadoop/hbase/client/AsyncAdminBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncAdminRequestRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncAdminRequestRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncBatchRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncBatchRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncClientScanner.java">org/apache/hadoop/hbase/client/AsyncClientScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncConnectionConfiguration.java">org/apache/hadoop/hbase/client/AsyncConnectionConfiguration.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncConnectionImpl.java">org/apache/hadoop/hbase/client/AsyncConnectionImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncHBaseAdmin.java">org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncMasterRequestRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncMasterRequestRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncMetaRegionLocator.java">org/apache/hadoop/hbase/client/AsyncMetaRegionLocator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncNonMetaRegionLocator.java">org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncProcess.java">org/apache/hadoop/hbase/client/AsyncProcess.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncProcessTask.java">org/apache/hadoop/hbase/client/AsyncProcessTask.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncRegionLocator.java">org/apache/hadoop/hbase/client/AsyncRegionLocator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncRegistryFactory.java">org/apache/hadoop/hbase/client/AsyncRegistryFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncRequestFuture.java">org/apache/hadoop/hbase/client/AsyncRequestFuture.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncRequestFutureImpl.java">org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncRpcRetryingCallerFactory.java">org/apache/hadoop/hbase/client/AsyncRpcRetryingCallerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncScanSingleRegionRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncServerRequestRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncServerRequestRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncSingleRequestRpcRetryingCaller.java">org/apache/hadoop/hbase/client/AsyncSingleRequestRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncTableImpl.java">org/apache/hadoop/hbase/client/AsyncTableImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.AsyncTableResultScanner.java">org/apache/hadoop/hbase/client/AsyncTableResultScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.BatchErrors.java">org/apache/hadoop/hbase/client/BatchErrors.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.BatchScanResultCache.java">org/apache/hadoop/hbase/client/BatchScanResultCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.BufferingScanResultConsumer.java">org/apache/hadoop/hbase/client/BufferingScanResultConsumer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.CancellableRegionServerCallable.java">org/apache/hadoop/hbase/client/CancellableRegionServerCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ClientAsyncPrefetchScanner.java">org/apache/hadoop/hbase/client/ClientAsyncPrefetchScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ClientIdGenerator.java">org/apache/hadoop/hbase/client/ClientIdGenerator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ClientScanner.java">org/apache/hadoop/hbase/client/ClientScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ClientServiceCallable.java">org/apache/hadoop/hbase/client/ClientServiceCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ClientSideRegionScanner.java">org/apache/hadoop/hbase/client/ClientSideRegionScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ClientSimpleScanner.java">org/apache/hadoop/hbase/client/ClientSimpleScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ClientUtil.java">org/apache/hadoop/hbase/client/ClientUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ColumnCountOnRowFilter.java">org/apache/hadoop/hbase/client/ColumnCountOnRowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ColumnFamilyDescriptor.java">org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder.java">org/apache/hadoop/hbase/client/ColumnFamilyDescriptorBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.CompactType.java">org/apache/hadoop/hbase/client/CompactType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.CompleteScanResultCache.java">org/apache/hadoop/hbase/client/CompleteScanResultCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ConnectionFactory.java">org/apache/hadoop/hbase/client/ConnectionFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ConnectionImplementation.java">org/apache/hadoop/hbase/client/ConnectionImplementation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ConnectionUtils.java">org/apache/hadoop/hbase/client/ConnectionUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.DelayingRunner.java">org/apache/hadoop/hbase/client/DelayingRunner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Delete.java">org/apache/hadoop/hbase/client/Delete.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Get.java">org/apache/hadoop/hbase/client/Get.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.HBaseAdmin.java">org/apache/hadoop/hbase/client/HBaseAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.HConnectionTestingUtility.java">org/apache/hadoop/hbase/client/HConnectionTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.HRegionLocator.java">org/apache/hadoop/hbase/client/HRegionLocator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.HTable.java">org/apache/hadoop/hbase/client/HTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.HTableMultiplexer.java">org/apache/hadoop/hbase/client/HTableMultiplexer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ImmutableHColumnDescriptor.java">org/apache/hadoop/hbase/client/ImmutableHColumnDescriptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ImmutableHRegionInfo.java">org/apache/hadoop/hbase/client/ImmutableHRegionInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ImmutableHTableDescriptor.java">org/apache/hadoop/hbase/client/ImmutableHTableDescriptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.MasterCallable.java">org/apache/hadoop/hbase/client/MasterCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.MasterCoprocessorRpcChannelImpl.java">org/apache/hadoop/hbase/client/MasterCoprocessorRpcChannelImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.MasterKeepAliveConnection.java">org/apache/hadoop/hbase/client/MasterKeepAliveConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.MetaCache.java">org/apache/hadoop/hbase/client/MetaCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.MetricsConnection.java">org/apache/hadoop/hbase/client/MetricsConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.MultiAction.java">org/apache/hadoop/hbase/client/MultiAction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.MultiResponse.java">org/apache/hadoop/hbase/client/MultiResponse.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.MultiServerCallable.java">org/apache/hadoop/hbase/client/MultiServerCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Mutation.java">org/apache/hadoop/hbase/client/Mutation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.NoOpRetryableCallerInterceptor.java">org/apache/hadoop/hbase/client/NoOpRetryableCallerInterceptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.NoncedRegionServerCallable.java">org/apache/hadoop/hbase/client/NoncedRegionServerCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Operation.java">org/apache/hadoop/hbase/client/Operation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.PackagePrivateFieldAccessor.java">org/apache/hadoop/hbase/client/PackagePrivateFieldAccessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.PreemptiveFastFailInterceptor.java">org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Put.java">org/apache/hadoop/hbase/client/Put.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Query.java">org/apache/hadoop/hbase/client/Query.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.QuotaStatusCalls.java">org/apache/hadoop/hbase/client/QuotaStatusCalls.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RawAsyncHBaseAdmin.java">org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RegionAdminServiceCallable.java">org/apache/hadoop/hbase/client/RegionAdminServiceCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RegionCoprocessorRpcChannel.java">org/apache/hadoop/hbase/client/RegionCoprocessorRpcChannel.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RegionCoprocessorRpcChannelImpl.java">org/apache/hadoop/hbase/client/RegionCoprocessorRpcChannelImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RegionCoprocessorServiceExec.java">org/apache/hadoop/hbase/client/RegionCoprocessorServiceExec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RegionInfo.java">org/apache/hadoop/hbase/client/RegionInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RegionInfoBuilder.java">org/apache/hadoop/hbase/client/RegionInfoBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RegionInfoDisplay.java">org/apache/hadoop/hbase/client/RegionInfoDisplay.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RegionLocator.java">org/apache/hadoop/hbase/client/RegionLocator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RegionReplicaUtil.java">org/apache/hadoop/hbase/client/RegionReplicaUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RegionServerCallable.java">org/apache/hadoop/hbase/client/RegionServerCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RegionServerCoprocessorRpcChannelImpl.java">org/apache/hadoop/hbase/client/RegionServerCoprocessorRpcChannelImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RequestController.java">org/apache/hadoop/hbase/client/RequestController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RequestControllerFactory.java">org/apache/hadoop/hbase/client/RequestControllerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Result.java">org/apache/hadoop/hbase/client/Result.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ResultBoundedCompletionService.java">org/apache/hadoop/hbase/client/ResultBoundedCompletionService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ResultScanner.java">org/apache/hadoop/hbase/client/ResultScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RetriesExhaustedException.java">org/apache/hadoop/hbase/client/RetriesExhaustedException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException.java">org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RetryingCallerInterceptor.java">org/apache/hadoop/hbase/client/RetryingCallerInterceptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ReversedClientScanner.java">org/apache/hadoop/hbase/client/ReversedClientScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ReversedScannerCallable.java">org/apache/hadoop/hbase/client/ReversedScannerCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RowAccess.java">org/apache/hadoop/hbase/client/RowAccess.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RowMutations.java">org/apache/hadoop/hbase/client/RowMutations.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RpcRetryingCaller.java">org/apache/hadoop/hbase/client/RpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.java">org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.java">org/apache/hadoop/hbase/client/RpcRetryingCallerWithReadReplicas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.Scan.java">org/apache/hadoop/hbase/client/Scan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ScannerCallable.java">org/apache/hadoop/hbase/client/ScannerCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.java">org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.SecureBulkLoadClient.java">org/apache/hadoop/hbase/client/SecureBulkLoadClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.ServerStatisticTracker.java">org/apache/hadoop/hbase/client/ServerStatisticTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.ShortCircuitMasterConnection.java">org/apache/hadoop/hbase/client/ShortCircuitMasterConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.SimpleRequestController.java">org/apache/hadoop/hbase/client/SimpleRequestController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.SimpleScanResultConsumer.java">org/apache/hadoop/hbase/client/SimpleScanResultConsumer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.SyncCoprocessorRpcChannel.java">org/apache/hadoop/hbase/client/SyncCoprocessorRpcChannel.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.Table.java">org/apache/hadoop/hbase/client/Table.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TableDescriptor.java">org/apache/hadoop/hbase/client/TableDescriptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TableDescriptorBuilder.java">org/apache/hadoop/hbase/client/TableDescriptorBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TableState.java">org/apache/hadoop/hbase/client/TableState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>36</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAdmin1.java">org/apache/hadoop/hbase/client/TestAdmin1.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAdmin2.java">org/apache/hadoop/hbase/client/TestAdmin2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAppendFromClientSide.java">org/apache/hadoop/hbase/client/TestAppendFromClientSide.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncClusterAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncClusterAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncNamespaceAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncNamespaceAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncProcess.java">org/apache/hadoop/hbase/client/TestAsyncProcess.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncQuotaAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncQuotaAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncRegionAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncRegionAdminApi2.java">org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncReplicationAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncReplicationAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncSingleRequestRpcRetryingCaller.java">org/apache/hadoop/hbase/client/TestAsyncSingleRequestRpcRetryingCaller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTable.java">org/apache/hadoop/hbase/client/TestAsyncTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableAdminApi.java">org/apache/hadoop/hbase/client/TestAsyncTableAdminApi.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableAdminApi2.java">org/apache/hadoop/hbase/client/TestAsyncTableAdminApi2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableAdminApi3.java">org/apache/hadoop/hbase/client/TestAsyncTableAdminApi3.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableScanMetrics.java">org/apache/hadoop/hbase/client/TestAsyncTableScanMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAsyncTableScanner.java">org/apache/hadoop/hbase/client/TestAsyncTableScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestAttributes.java">org/apache/hadoop/hbase/client/TestAttributes.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestAvoidCellReferencesIntoShippedBlocks.java">org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestBlockEvictionFromClient.java">org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestBufferedMutator.java">org/apache/hadoop/hbase/client/TestBufferedMutator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestCheckAndMutate.java">org/apache/hadoop/hbase/client/TestCheckAndMutate.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestClientExponentialBackoff.java">org/apache/hadoop/hbase/client/TestClientExponentialBackoff.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestClientNoCluster.java">org/apache/hadoop/hbase/client/TestClientNoCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestClientPushback.java">org/apache/hadoop/hbase/client/TestClientPushback.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestClientScanner.java">org/apache/hadoop/hbase/client/TestClientScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestClientTimeouts.java">org/apache/hadoop/hbase/client/TestClientTimeouts.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestCloneSnapshotFromClient.java">org/apache/hadoop/hbase/client/TestCloneSnapshotFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestColumnFamilyDescriptorBuilder.java">org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestConnectionImplementation.java">org/apache/hadoop/hbase/client/TestConnectionImplementation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestEnableTable.java">org/apache/hadoop/hbase/client/TestEnableTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestFastFail.java">org/apache/hadoop/hbase/client/TestFastFail.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestFromClientSide.java">org/apache/hadoop/hbase/client/TestFromClientSide.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>71</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestFromClientSide3.java">org/apache/hadoop/hbase/client/TestFromClientSide3.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestFromClientSideNoCodec.java">org/apache/hadoop/hbase/client/TestFromClientSideNoCodec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestFromClientSideScanExcpetion.java">org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestGet.java">org/apache/hadoop/hbase/client/TestGet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestHBaseAdminNoCluster.java">org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestHTableMultiplexer.java">org/apache/hadoop/hbase/client/TestHTableMultiplexer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestHTableMultiplexerFlushCache.java">org/apache/hadoop/hbase/client/TestHTableMultiplexerFlushCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestImmutableHTableDescriptor.java">org/apache/hadoop/hbase/client/TestImmutableHTableDescriptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestIncrementsFromClientSide.java">org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestIntraRowPagination.java">org/apache/hadoop/hbase/client/TestIntraRowPagination.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestLeaseRenewal.java">org/apache/hadoop/hbase/client/TestLeaseRenewal.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestLimitedScanWithFilter.java">org/apache/hadoop/hbase/client/TestLimitedScanWithFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestMetaCache.java">org/apache/hadoop/hbase/client/TestMetaCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestMetricsConnection.java">org/apache/hadoop/hbase/client/TestMetricsConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestMobCloneSnapshotFromClient.java">org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestMultiParallel.java">org/apache/hadoop/hbase/client/TestMultiParallel.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestMultipleTimestamps.java">org/apache/hadoop/hbase/client/TestMultipleTimestamps.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestOperation.java">org/apache/hadoop/hbase/client/TestOperation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestPutDeleteEtcCellIteration.java">org/apache/hadoop/hbase/client/TestPutDeleteEtcCellIteration.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestPutWithDelete.java">org/apache/hadoop/hbase/client/TestPutWithDelete.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestRawAsyncTableLimitedScanWithFilter.java">org/apache/hadoop/hbase/client/TestRawAsyncTableLimitedScanWithFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestRawAsyncTableScan.java">org/apache/hadoop/hbase/client/TestRawAsyncTableScan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestReplicaWithCluster.java">org/apache/hadoop/hbase/client/TestReplicaWithCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestReplicasClient.java">org/apache/hadoop/hbase/client/TestReplicasClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestRestoreSnapshotFromClient.java">org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestResult.java">org/apache/hadoop/hbase/client/TestResult.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestResultSizeEstimation.java">org/apache/hadoop/hbase/client/TestResultSizeEstimation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestReversedScannerCallable.java">org/apache/hadoop/hbase/client/TestReversedScannerCallable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestScan.java">org/apache/hadoop/hbase/client/TestScan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestScannerTimeout.java">org/apache/hadoop/hbase/client/TestScannerTimeout.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestScannersFromClientSide.java">org/apache/hadoop/hbase/client/TestScannersFromClientSide.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestScannersFromClientSide2.java">org/apache/hadoop/hbase/client/TestScannersFromClientSide2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestServerBusyException.java">org/apache/hadoop/hbase/client/TestServerBusyException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestSmallReversedScanner.java">org/apache/hadoop/hbase/client/TestSmallReversedScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotCloneIndependence.java">org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotFromAdmin.java">org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotFromClient.java">org/apache/hadoop/hbase/client/TestSnapshotFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestSnapshotMetadata.java">org/apache/hadoop/hbase/client/TestSnapshotMetadata.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestSplitOrMergeStatus.java">org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestTableDescriptorBuilder.java">org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestTableFavoredNodes.java">org/apache/hadoop/hbase/client/TestTableFavoredNodes.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TestTableSnapshotScanner.java">org/apache/hadoop/hbase/client/TestTableSnapshotScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.TestTimestampsFilter.java">org/apache/hadoop/hbase/client/TestTimestampsFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.VersionInfoUtil.java">org/apache/hadoop/hbase/client/VersionInfoUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.backoff.ClientBackoffPolicyFactory.java">org/apache/hadoop/hbase/client/backoff/ClientBackoffPolicyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.backoff.ServerStatistics.java">org/apache/hadoop/hbase/client/backoff/ServerStatistics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.AggregationClient.java">org/apache/hadoop/hbase/client/coprocessor/AggregationClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.AggregationHelper.java">org/apache/hadoop/hbase/client/coprocessor/AggregationHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.AsyncAggregationClient.java">org/apache/hadoop/hbase/client/coprocessor/AsyncAggregationClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.BigDecimalColumnInterpreter.java">org/apache/hadoop/hbase/client/coprocessor/BigDecimalColumnInterpreter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.DoubleColumnInterpreter.java">org/apache/hadoop/hbase/client/coprocessor/DoubleColumnInterpreter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.LongColumnInterpreter.java">org/apache/hadoop/hbase/client/coprocessor/LongColumnInterpreter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.RowProcessorClient.java">org/apache/hadoop/hbase/client/coprocessor/RowProcessorClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.coprocessor.package-info.java">org/apache/hadoop/hbase/client/coprocessor/package-info.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.example.ExportEndpointExample.java">org/apache/hadoop/hbase/client/example/ExportEndpointExample.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.example.RefreshHFilesClient.java">org/apache/hadoop/hbase/client/example/RefreshHFilesClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.locking.EntityLock.java">org/apache/hadoop/hbase/client/locking/EntityLock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.locking.TestEntityLocks.java">org/apache/hadoop/hbase/client/locking/TestEntityLocks.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.metrics.ScanMetrics.java">org/apache/hadoop/hbase/client/metrics/ScanMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.metrics.ServerSideScanMetrics.java">org/apache/hadoop/hbase/client/metrics/ServerSideScanMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.replication.ReplicationAdmin.java">org/apache/hadoop/hbase/client/replication/ReplicationAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.replication.ReplicationPeerConfigUtil.java">org/apache/hadoop/hbase/client/replication/ReplicationPeerConfigUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.replication.TableCFs.java">org/apache/hadoop/hbase/client/replication/TableCFs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.replication.TestReplicationAdmin.java">org/apache/hadoop/hbase/client/replication/TestReplicationAdmin.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.codec.BaseDecoder.java">org/apache/hadoop/hbase/codec/BaseDecoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.codec.BaseEncoder.java">org/apache/hadoop/hbase/codec/BaseEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.codec.CellCodec.java">org/apache/hadoop/hbase/codec/CellCodec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.codec.CellCodecWithTags.java">org/apache/hadoop/hbase/codec/CellCodecWithTags.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.codec.CodecPerformance.java">org/apache/hadoop/hbase/codec/CodecPerformance.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.codec.MessageCodec.java">org/apache/hadoop/hbase/codec/MessageCodec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.codec.TestCellCodecWithTags.java">org/apache/hadoop/hbase/codec/TestCellCodecWithTags.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.codec.TestCellMessageCodec.java">org/apache/hadoop/hbase/codec/TestCellMessageCodec.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.codec.TestKeyValueCodecWithTags.java">org/apache/hadoop/hbase/codec/TestKeyValueCodecWithTags.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.conf.ConfigurationManager.java">org/apache/hadoop/hbase/conf/ConfigurationManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.constraint.BaseConstraint.java">org/apache/hadoop/hbase/constraint/BaseConstraint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.constraint.CheckConfigurationConstraint.java">org/apache/hadoop/hbase/constraint/CheckConfigurationConstraint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.constraint.Constraint.java">org/apache/hadoop/hbase/constraint/Constraint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.constraint.ConstraintException.java">org/apache/hadoop/hbase/constraint/ConstraintException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.constraint.ConstraintProcessor.java">org/apache/hadoop/hbase/constraint/ConstraintProcessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.constraint.Constraints.java">org/apache/hadoop/hbase/constraint/Constraints.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.constraint.TestConstraint.java">org/apache/hadoop/hbase/constraint/TestConstraint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.constraint.TestConstraints.java">org/apache/hadoop/hbase/constraint/TestConstraints.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.constraint.package-info.java">org/apache/hadoop/hbase/constraint/package-info.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coordination.SplitLogManagerCoordination.java">org/apache/hadoop/hbase/coordination/SplitLogManagerCoordination.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coordination.SplitLogWorkerCoordination.java">org/apache/hadoop/hbase/coordination/SplitLogWorkerCoordination.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coordination.ZKSplitLogManagerCoordination.java">org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coordination.ZkCoordinatedStateManager.java">org/apache/hadoop/hbase/coordination/ZkCoordinatedStateManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coordination.ZkSplitLogWorkerCoordination.java">org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.AggregateImplementation.java">org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.BaseEnvironment.java">org/apache/hadoop/hbase/coprocessor/BaseEnvironment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.BaseRowProcessorEndpoint.java">org/apache/hadoop/hbase/coprocessor/BaseRowProcessorEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.BulkLoadObserver.java">org/apache/hadoop/hbase/coprocessor/BulkLoadObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ColumnAggregationEndpoint.java">org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ColumnAggregationEndpointNullResponse.java">org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointNullResponse.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ColumnAggregationEndpointWithErrors.java">org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointWithErrors.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ColumnInterpreter.java">org/apache/hadoop/hbase/coprocessor/ColumnInterpreter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.CoprocessorException.java">org/apache/hadoop/hbase/coprocessor/CoprocessorException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.CoprocessorHost.java">org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.CoprocessorService.java">org/apache/hadoop/hbase/coprocessor/CoprocessorService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.CoprocessorServiceBackwardCompatiblity.java">org/apache/hadoop/hbase/coprocessor/CoprocessorServiceBackwardCompatiblity.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.CoreCoprocessor.java">org/apache/hadoop/hbase/coprocessor/CoreCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.EndpointObserver.java">org/apache/hadoop/hbase/coprocessor/EndpointObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.Export.java">org/apache/hadoop/hbase/coprocessor/Export.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.HasMasterServices.java">org/apache/hadoop/hbase/coprocessor/HasMasterServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.HasRegionServerServices.java">org/apache/hadoop/hbase/coprocessor/HasRegionServerServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.MasterCoprocessor.java">org/apache/hadoop/hbase/coprocessor/MasterCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.MasterObserver.java">org/apache/hadoop/hbase/coprocessor/MasterObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.MetricsCoprocessor.java">org/apache/hadoop/hbase/coprocessor/MetricsCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint.java">org/apache/hadoop/hbase/coprocessor/MultiRowMutationEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ObserverContext.java">org/apache/hadoop/hbase/coprocessor/ObserverContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ObserverContextImpl.java">org/apache/hadoop/hbase/coprocessor/ObserverContextImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.ProtobufCoprocessorService.java">org/apache/hadoop/hbase/coprocessor/ProtobufCoprocessorService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionCoprocessor.java">org/apache/hadoop/hbase/coprocessor/RegionCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment.java">org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionObserver.java">org/apache/hadoop/hbase/coprocessor/RegionObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessor.java">org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.RegionServerObserver.java">org/apache/hadoop/hbase/coprocessor/RegionServerObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver.java">org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.SingletonCoprocessorService.java">org/apache/hadoop/hbase/coprocessor/SingletonCoprocessorService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestAsyncCoprocessorEndpoint.java">org/apache/hadoop/hbase/coprocessor/TestAsyncCoprocessorEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestClassLoading.java">org/apache/hadoop/hbase/coprocessor/TestClassLoading.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoprocessorEndpoint.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoprocessorHost.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoprocessorInterface.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoprocessorMetrics.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoprocessorServiceBackwardCompatibility.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorServiceBackwardCompatibility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoprocessorStop.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorStop.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoprocessorTableEndpoint.java">org/apache/hadoop/hbase/coprocessor/TestCoprocessorTableEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoreMasterCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreMasterCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoreRegionCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreRegionCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestCoreRegionServerCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestCoreRegionServerCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestMasterCoprocessorExceptionWithAbort.java">org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithAbort.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestMasterCoprocessorExceptionWithRemove.java">org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithRemove.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestMasterObserver.java">org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestOpenTableInCoprocessor.java">org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverBypass.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverForAddingMutationsFromCoprocessors.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverInterface.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverScannerOpenHook.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRegionObserverStacking.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestRowProcessorEndpoint.java">org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.TestSecureExport.java">org/apache/hadoop/hbase/coprocessor/TestSecureExport.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.WALCoprocessor.java">org/apache/hadoop/hbase/coprocessor/WALCoprocessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.WALCoprocessorEnvironment.java">org/apache/hadoop/hbase/coprocessor/WALCoprocessorEnvironment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.WALObserver.java">org/apache/hadoop/hbase/coprocessor/WALObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.example.BulkDeleteEndpoint.java">org/apache/hadoop/hbase/coprocessor/example/BulkDeleteEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.example.ExampleMasterObserverWithMetrics.java">org/apache/hadoop/hbase/coprocessor/example/ExampleMasterObserverWithMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.example.RefreshHFilesEndpoint.java">org/apache/hadoop/hbase/coprocessor/example/RefreshHFilesEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.example.RowCountEndpoint.java">org/apache/hadoop/hbase/coprocessor/example/RowCountEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.example.TestRefreshHFilesEndpoint.java">org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.coprocessor.package-info.java">org/apache/hadoop/hbase/coprocessor/package-info.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.ForeignException.java">org/apache/hadoop/hbase/errorhandling/ForeignException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher.java">org/apache/hadoop/hbase/errorhandling/ForeignExceptionDispatcher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.TestForeignExceptionDispatcher.java">org/apache/hadoop/hbase/errorhandling/TestForeignExceptionDispatcher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.TestForeignExceptionSerialization.java">org/apache/hadoop/hbase/errorhandling/TestForeignExceptionSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.errorhandling.TimeoutExceptionInjector.java">org/apache/hadoop/hbase/errorhandling/TimeoutExceptionInjector.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil.java">org/apache/hadoop/hbase/exceptions/ClientExceptionsUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.exceptions.FailedSanityCheckException.java">org/apache/hadoop/hbase/exceptions/FailedSanityCheckException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.exceptions.MergeRegionException.java">org/apache/hadoop/hbase/exceptions/MergeRegionException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.exceptions.TestClientExceptionsUtil.java">org/apache/hadoop/hbase/exceptions/TestClientExceptionsUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.executor.EventHandler.java">org/apache/hadoop/hbase/executor/EventHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.executor.EventType.java">org/apache/hadoop/hbase/executor/EventType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.executor.ExecutorService.java">org/apache/hadoop/hbase/executor/ExecutorService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.executor.ExecutorType.java">org/apache/hadoop/hbase/executor/ExecutorType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.favored.FavoredNodeAssignmentHelper.java">org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.favored.FavoredNodeLoadBalancer.java">org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.favored.FavoredNodesPlan.java">org/apache/hadoop/hbase/favored/FavoredNodesPlan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.favored.FavoredNodesPromoter.java">org/apache/hadoop/hbase/favored/FavoredNodesPromoter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.favored.StartcodeAgnosticServerName.java">org/apache/hadoop/hbase/favored/StartcodeAgnosticServerName.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.favored.TestFavoredNodeAssignmentHelper.java">org/apache/hadoop/hbase/favored/TestFavoredNodeAssignmentHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.BigDecimalComparator.java">org/apache/hadoop/hbase/filter/BigDecimalComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.BinaryComparator.java">org/apache/hadoop/hbase/filter/BinaryComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.BinaryPrefixComparator.java">org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.BitComparator.java">org/apache/hadoop/hbase/filter/BitComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.ByteArrayComparable.java">org/apache/hadoop/hbase/filter/ByteArrayComparable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.ColumnCountGetFilter.java">org/apache/hadoop/hbase/filter/ColumnCountGetFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.ColumnPaginationFilter.java">org/apache/hadoop/hbase/filter/ColumnPaginationFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.ColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/ColumnPrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.ColumnRangeFilter.java">org/apache/hadoop/hbase/filter/ColumnRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.CompareFilter.java">org/apache/hadoop/hbase/filter/CompareFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.DependentColumnFilter.java">org/apache/hadoop/hbase/filter/DependentColumnFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FamilyFilter.java">org/apache/hadoop/hbase/filter/FamilyFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.Filter.java">org/apache/hadoop/hbase/filter/Filter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterAllFilter.java">org/apache/hadoop/hbase/filter/FilterAllFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterBase.java">org/apache/hadoop/hbase/filter/FilterBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterList.java">org/apache/hadoop/hbase/filter/FilterList.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterListBase.java">org/apache/hadoop/hbase/filter/FilterListBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterListWithAND.java">org/apache/hadoop/hbase/filter/FilterListWithAND.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterListWithOR.java">org/apache/hadoop/hbase/filter/FilterListWithOR.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterTestingCluster.java">org/apache/hadoop/hbase/filter/FilterTestingCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FilterWrapper.java">org/apache/hadoop/hbase/filter/FilterWrapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter.java">org/apache/hadoop/hbase/filter/FirstKeyOnlyFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.FirstKeyValueMatchingQualifiersFilter.java">org/apache/hadoop/hbase/filter/FirstKeyValueMatchingQualifiersFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.FuzzyRowFilter.java">org/apache/hadoop/hbase/filter/FuzzyRowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.InclusiveStopFilter.java">org/apache/hadoop/hbase/filter/InclusiveStopFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.KeyOnlyFilter.java">org/apache/hadoop/hbase/filter/KeyOnlyFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.LongComparator.java">org/apache/hadoop/hbase/filter/LongComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.MultiRowRangeFilter.java">org/apache/hadoop/hbase/filter/MultiRowRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.MultipleColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.NullComparator.java">org/apache/hadoop/hbase/filter/NullComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.PageFilter.java">org/apache/hadoop/hbase/filter/PageFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.ParseConstants.java">org/apache/hadoop/hbase/filter/ParseConstants.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.ParseFilter.java">org/apache/hadoop/hbase/filter/ParseFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.PrefixFilter.java">org/apache/hadoop/hbase/filter/PrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.QualifierFilter.java">org/apache/hadoop/hbase/filter/QualifierFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.RandomRowFilter.java">org/apache/hadoop/hbase/filter/RandomRowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.RegexStringComparator.java">org/apache/hadoop/hbase/filter/RegexStringComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.RowFilter.java">org/apache/hadoop/hbase/filter/RowFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter.java">org/apache/hadoop/hbase/filter/SingleColumnValueExcludeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>22</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.SingleColumnValueFilter.java">org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.SkipFilter.java">org/apache/hadoop/hbase/filter/SkipFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.SubstringComparator.java">org/apache/hadoop/hbase/filter/SubstringComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestColumnPaginationFilter.java">org/apache/hadoop/hbase/filter/TestColumnPaginationFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestColumnPrefixFilter.java">org/apache/hadoop/hbase/filter/TestColumnPrefixFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestColumnRangeFilter.java">org/apache/hadoop/hbase/filter/TestColumnRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestComparators.java">org/apache/hadoop/hbase/filter/TestComparators.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestDependentColumnFilter.java">org/apache/hadoop/hbase/filter/TestDependentColumnFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilter.java">org/apache/hadoop/hbase/filter/TestFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>348</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterList.java">org/apache/hadoop/hbase/filter/TestFilterList.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterListOnMini.java">org/apache/hadoop/hbase/filter/TestFilterListOnMini.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterListOrOperatorWithBlkCnt.java">org/apache/hadoop/hbase/filter/TestFilterListOrOperatorWithBlkCnt.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterSerialization.java">org/apache/hadoop/hbase/filter/TestFilterSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterWithScanLimits.java">org/apache/hadoop/hbase/filter/TestFilterWithScanLimits.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFilterWrapper.java">org/apache/hadoop/hbase/filter/TestFilterWrapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFirstKeyValueMatchingQualifiersFilter.java">org/apache/hadoop/hbase/filter/TestFirstKeyValueMatchingQualifiersFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFuzzyRowAndColumnRangeFilter.java">org/apache/hadoop/hbase/filter/TestFuzzyRowAndColumnRangeFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestFuzzyRowFilterEndToEnd.java">org/apache/hadoop/hbase/filter/TestFuzzyRowFilterEndToEnd.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.filter.TestInclusiveStopFilter.java">org/apache/hadoop/hbase/filter/TestInclusiveStopFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.TestLongComparator.java">org/apache/

<TRUNCATED>

[05/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index ed511de..2da382e 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -452,7 +452,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index af577ab..c157980 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -407,7 +407,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index a24b3a9..ecb3c65 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -429,7 +429,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 97362b1..79856f1 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -368,7 +368,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 864da07..8e3dc61 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -762,7 +762,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index eb03409..0f69bd6 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -328,7 +328,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index c374119..b3643bd 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -298,7 +298,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 3cad00d..f5ce04f 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -324,7 +324,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index d2b0215..7686b00 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -301,7 +301,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index ec48ebd..d443d7d 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -296,7 +296,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index e12a398..8cbba72 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -324,7 +324,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index fa3a891..7ea292f 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -292,7 +292,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 9c0e54f..f09ee99 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 110c3f0..d142fe6 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -513,7 +513,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 64f6571..a68c495 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -717,7 +717,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index b99a095..fdd0026 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -680,6 +680,7 @@
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupDescribe</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupHFileCleaner</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/master/TestBackupLogCleaner.html" title="class in org.apache.hadoop.hbase.backup.master" target="classFrame">TestBackupLogCleaner</a></li>
+<li><a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupMerge</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupMultipleDeletes</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupRepair</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupShowHistory</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 22abdb8..a01dd7c 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -680,6 +680,7 @@
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDescribe</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup">TestBackupHFileCleaner</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/master/TestBackupLogCleaner.html" title="class in org.apache.hadoop.hbase.backup.master">TestBackupLogCleaner</a></li>
+<li><a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMerge</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMultipleDeletes</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup">TestBackupRepair</a></li>
 <li><a href="org/apache/hadoop/hbase/backup/TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup">TestBackupShowHistory</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 6b0242e..2c5c5bb 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -3977,6 +3977,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup">TestBackupHFileCleaner</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMerge</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMultipleDeletes</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup">TestBackupRepair</a></dt>
@@ -22427,6 +22429,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup">TestBackupHFileCleaner</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMerge</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMultipleDeletes</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup">TestBackupRepair</a></dt>
@@ -43730,6 +43734,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/master/TestBackupLogCleaner.html#testBackupLogCleaner--">testBackupLogCleaner()</a></span> - Method in class org.apache.hadoop.hbase.backup.master.<a href="org/apache/hadoop/hbase/backup/master/TestBackupLogCleaner.html" title="class in org.apache.hadoop.hbase.backup.master">TestBackupLogCleaner</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupMerge</span></a> - Class in <a href="org/apache/hadoop/hbase/backup/package-summary.html">org.apache.hadoop.hbase.backup</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html#TestBackupMerge--">TestBackupMerge()</a></span> - Constructor for class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMerge</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupMultipleDeletes</span></a> - Class in <a href="org/apache/hadoop/hbase/backup/package-summary.html">org.apache.hadoop.hbase.backup</a></dt>
 <dd>
 <div class="block">Create multiple backups for two tables: table1, table2 then perform 1 delete</div>
@@ -50630,6 +50638,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#TestIncBackupDeleteTable--">TestIncBackupDeleteTable()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithBulkLoad</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html#TestIncBackupMergeRestore--">TestIncBackupMergeRestore()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMerge</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#TestIncBackupMergeRestore--">TestIncBackupMergeRestore()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackup.html#TestIncBackupRestore--">TestIncBackupRestore()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestIncrementalBackup.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackup</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupBase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupBase.html b/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupBase.html
index fc9b80e..09282bb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupBase.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupBase.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <dl>
 <dt>Direct Known Subclasses:</dt>
-<dd><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBoundaryTests.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBoundaryTests</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDelete.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteRestore.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDeleteRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDeleteWithFailures</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDescribe</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/master/TestBackupLogCleaner.html" title="class in org.apache.hadoop.hbase.backup.master">TestBackupLogCleaner</a>, <a href="../../../../../org
 /apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMultipleDeletes</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup">TestBackupRepair</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup">TestBackupShowHistory</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupSmallTests.html" title="class in org.apache.hadoop.hbase.backup">TestBackupSmallTests</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupStatusProgress.html" title="class in org.apache.hadoop.hbase.backup">TestBackupStatusProgress</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackup.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackup</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupSet.html" title="cl
 ass in org.apache.hadoop.hbase.backup">TestFullBackupSet</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupSetRestoreSet.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupSetRestoreSet</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupWithFailures</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullRestore.html" title="class in org.apache.hadoop.hbase.backup">TestFullRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackup.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackup</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupDeleteTable.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupDeleteTable</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html" title="class 
 in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithBulkLoad</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithFailures</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestRemoteBackup.html" title="class in org.apache.hadoop.hbase.backup">TestRemoteBackup</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestRemoteRestore.html" title="class in org.apache.hadoop.hbase.backup">TestRemoteRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html" title="class in org.apache.hadoop.hbase.backup">TestRepairAfterFailedDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestRestoreBoundaryTests.html" 
 title="class in org.apache.hadoop.hbase.backup">TestRestoreBoundaryTests</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestSystemTableSnapshot.html" title="class in org.apache.hadoop.hbase.backup">TestSystemTableSnapshot</a></dd>
+<dd><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBoundaryTests.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBoundaryTests</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDelete.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteRestore.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDeleteRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDeleteWithFailures</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup">TestBackupDescribe</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/master/TestBackupLogCleaner.html" title="class in org.apache.hadoop.hbase.backup.master">TestBackupLogCleaner</a>, <a href="../../../../../org
 /apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMerge</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMultipleDeletes</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup">TestBackupRepair</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup">TestBackupShowHistory</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupSmallTests.html" title="class in org.apache.hadoop.hbase.backup">TestBackupSmallTests</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupStatusProgress.html" title="class in org.apache.hadoop.hbase.backup">TestBackupStatusProgress</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackup.html" title="cla
 ss in org.apache.hadoop.hbase.backup">TestFullBackup</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupSet.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupSet</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupSetRestoreSet.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupSetRestoreSet</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupWithFailures</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestFullRestore.html" title="class in org.apache.hadoop.hbase.backup">TestFullRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackup.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackup</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupDeleteTable.html" title="class in org.apache.hadoop.hbase.backup">TestI
 ncrementalBackupDeleteTable</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithBulkLoad</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithFailures</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestRemoteBackup.html" title="class in org.apache.hadoop.hbase.backup">TestRemoteBackup</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestRemoteRestore.html" title="class in org.apache.hadoop.hbase.backup">TestRemoteRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html" title="class in org.a
 pache.hadoop.hbase.backup">TestRepairAfterFailedDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestRestoreBoundaryTests.html" title="class in org.apache.hadoop.hbase.backup">TestRestoreBoundaryTests</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestSystemTableSnapshot.html" title="class in org.apache.hadoop.hbase.backup">TestSystemTableSnapshot</a></dd>
 </dl>
 <hr>
 <br>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html b/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html
index d5bb332..56aab9c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" target="_top">Frames</a></li>
@@ -426,7 +426,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMerge.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMerge.html b/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMerge.html
new file mode 100644
index 0000000..39d0af0
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMerge.html
@@ -0,0 +1,360 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestBackupMerge (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestBackupMerge (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestBackupMerge.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/backup/TestBackupMerge.html" target="_top">Frames</a></li>
+<li><a href="TestBackupMerge.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.backup.TestBackupBase">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.backup</div>
+<h2 title="Class TestBackupMerge" class="title">Class TestBackupMerge</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html" title="class in org.apache.hadoop.hbase.backup">org.apache.hadoop.hbase.backup.TestBackupBase</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.backup.TestBackupMerge</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html#line.43">TestBackupMerge</a>
+extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBase</a></pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="nested.class.summary">
+<!--   -->
+</a>
+<h3>Nested Class Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.backup.TestBackupBase">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from class&nbsp;org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBase</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.FullTableBackupClientForTest.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBase.FullTableBackupClientForTest</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.IncrementalTableBackupClientForTest.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBase.IncrementalTableBackupClientForTest</a></code></li>
+</ul>
+</li>
+</ul>
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.slf4j.Logger</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html#LOG">LOG</a></span></code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.backup.TestBackupBase">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBase</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#autoRestoreOnFailure">autoRestoreOnFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#BACKUP_REMOTE_ROOT_DIR">BACKUP_REMOTE_ROOT_DIR</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#BACKUP_ROOT_DIR">BACKUP_ROOT_DIR</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#conf1">conf1</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#conf2">conf2</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#famName">famName</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#NB_ROWS_IN_BATCH">NB_ROWS_IN_BATCH</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#provider">provider</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#qualName">qualName</a>, <a href="../../../../../org/apac
 he/hadoop/hbase/backup/TestBackupBase.html#secure">secure</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#setupIsDone">setupIsDone</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table1">table1</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table1_restore">table1_restore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table1Desc">table1Desc</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table2">table2</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table2_restore">table2_restore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table3">table3</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table3_restore">table3_restore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table4">table4</a>, <a href="../.
 ./../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#table4_restore">table4_restore</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#TEST_UTIL">TEST_UTIL</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#TEST_UTIL2">TEST_UTIL2</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#useSecondCluster">useSecondCluster</a></code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html#TestBackupMerge--">TestBackupMerge</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html#TestIncBackupMergeRestore--">TestIncBackupMergeRestore</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.backup.TestBackupBase">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBase</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#backupTables-org.apache.hadoop.hbase.backup.BackupType-java.util.List-java.lang.String-">backupTables</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#checkFailed-java.lang.String-">checkFailed</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#checkSucceeded-java.lang.String-">checkSucceeded</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#createBackupRequest-org.apache.hadoop.hbase.backup.BackupType-java.util.List-java.lang.String-">createBackupRequest</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#createTables--">createTables</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#dumpBackupDir--">dumpBackupDir</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#fullTableBackup-java.util.List-">fullTableBackup</a>, <a href="../
 ../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#getBackupAdmin--">getBackupAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#incrementalTableBackup-java.util.List-">incrementalTableBackup</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#insertIntoTable-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.TableName-byte:A-int-int-">insertIntoTable</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#loadTable-org.apache.hadoop.hbase.client.Table-">loadTable</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#setUp--">setUp</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#tearDown--">tearDown</a>, <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html#toList-java.lang.String...-">toList</a></code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="CLASS_RULE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CLASS_RULE</h4>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html#line.46">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="LOG">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>LOG</h4>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html#line.49">LOG</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestBackupMerge--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestBackupMerge</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html#line.43">TestBackupMerge</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="TestIncBackupMergeRestore--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestIncBackupMergeRestore</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html#line.55">TestIncBackupMergeRestore</a>()
+                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestBackupMerge.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/backup/TestBackupMerge.html" target="_top">Frames</a></li>
+<li><a href="TestBackupMerge.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.backup.TestBackupBase">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html b/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html
index ad13ed3..c82148c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -315,7 +315,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html b/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html
index 7ea7c2e..c6e7c81 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.70">TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.71">TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures</a>
 extends org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob</pre>
 </li>
 </ul>
@@ -206,7 +206,7 @@ extends org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob</h3>
-<code>cleanupBulkLoadDirs, deleteBackupImages, findInputDirectories, findMostRecentBackupId, getBackupIdsToDelete, getConf, getTableNamesInBackupImages, moveData, toPathList, toTableNameList, updateBackupManifest</code></li>
+<code>cleanupBulkLoadDirs, convertToDest, copyFile, copyMetaData, deleteBackupImages, findInputDirectories, getBackupIdsToDelete, getConf, getTableNamesInBackupImages, moveData, toPathList, toTableNameList, updateBackupManifest</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -235,7 +235,7 @@ extends org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>failurePhase</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.71">failurePhase</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.72">failurePhase</a></pre>
 </li>
 </ul>
 </li>
@@ -252,7 +252,7 @@ extends org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BackupMergeJobWithFailures</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.70">BackupMergeJobWithFailures</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.71">BackupMergeJobWithFailures</a>()</pre>
 </li>
 </ul>
 </li>
@@ -269,7 +269,7 @@ extends org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>setConf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.74">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.75">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>setConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -284,7 +284,7 @@ extends org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.89">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.90">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)
          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This is the exact copy of parent's run() with injections
  of different types of failures</div>
@@ -304,7 +304,7 @@ extends org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkFailure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.198">checkFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a>&nbsp;phase)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.219">checkFailure</a>(<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a>&nbsp;phase)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html b/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html
index ce8e447..0d80788 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.64">TestIncrementalBackupMergeWithFailures.FailurePhase</a>
+<pre>static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.65">TestIncrementalBackupMergeWithFailures.FailurePhase</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a>&gt;</pre>
 </li>
 </ul>
@@ -216,7 +216,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>PHASE1</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.65">PHASE1</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.66">PHASE1</a></pre>
 </li>
 </ul>
 <a name="PHASE2">
@@ -225,7 +225,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>PHASE2</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.65">PHASE2</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.66">PHASE2</a></pre>
 </li>
 </ul>
 <a name="PHASE3">
@@ -234,7 +234,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>PHASE3</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.65">PHASE3</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.66">PHASE3</a></pre>
 </li>
 </ul>
 <a name="PHASE4">
@@ -243,7 +243,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PHASE4</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.65">PHASE4</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.66">PHASE4</a></pre>
 </li>
 </ul>
 </li>
@@ -260,7 +260,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.64">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.65">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -280,7 +280,7 @@ for (TestIncrementalBackupMergeWithFailures.FailurePhase c : TestIncrementalBack
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.64">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html#line.65">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html b/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html
index de20784..a4693ad 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.55">TestIncrementalBackupMergeWithFailures</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.56">TestIncrementalBackupMergeWithFailures</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBase</a></pre>
 </li>
 </ul>
@@ -254,7 +254,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.58">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.59">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -263,7 +263,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.61">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.62">LOG</a></pre>
 </li>
 </ul>
 <a name="FAILURE_PHASE_KEY">
@@ -272,7 +272,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FAILURE_PHASE_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.68">FAILURE_PHASE_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.69">FAILURE_PHASE_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.backup.TestIncrementalBackupMergeWithFailures.FAILURE_PHASE_KEY">Constant Field Values</a></dd>
@@ -293,7 +293,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestIncrementalBackupMergeWithFailures</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.55">TestIncrementalBackupMergeWithFailures</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.56">TestIncrementalBackupMergeWithFailures</a>()</pre>
 </li>
 </ul>
 </li>
@@ -310,7 +310,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestIncBackupMergeRestore</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.206">TestIncBackupMergeRestore</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.227">TestIncBackupMergeRestore</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupBase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupBase.html b/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupBase.html
index 3a61149..12442c7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupBase.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupBase.html
@@ -130,87 +130,91 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMerge</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMultipleDeletes</a></span></code>
 <div class="block">Create multiple backups for two tables: table1, table2 then perform 1 delete</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup">TestBackupRepair</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup">TestBackupShowHistory</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestBackupSmallTests.html" title="class in org.apache.hadoop.hbase.backup">TestBackupSmallTests</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestBackupStatusProgress.html" title="class in org.apache.hadoop.hbase.backup">TestBackupStatusProgress</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestFullBackup.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackup</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestFullBackupSet.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupSet</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestFullBackupSetRestoreSet.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupSetRestoreSet</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestFullBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupWithFailures</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestFullRestore.html" title="class in org.apache.hadoop.hbase.backup">TestFullRestore</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackup.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackup</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupDeleteTable.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupDeleteTable</a></span></code>
 <div class="block">1.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithBulkLoad</a></span></code>
 <div class="block">1.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithFailures</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestRemoteBackup.html" title="class in org.apache.hadoop.hbase.backup">TestRemoteBackup</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestRemoteRestore.html" title="class in org.apache.hadoop.hbase.backup">TestRemoteRestore</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html" title="class in org.apache.hadoop.hbase.backup">TestRepairAfterFailedDelete</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestRestoreBoundaryTests.html" title="class in org.apache.hadoop.hbase.backup">TestRestoreBoundaryTests</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/TestSystemTableSnapshot.html" title="class in org.apache.hadoop.hbase.backup">TestSystemTableSnapshot</a></span></code>&nbsp;</td>
 </tr>


[10/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[02/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html
index e82daed..478e1af 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html
@@ -39,299 +39,323 @@
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.TableName;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.backup.impl.BackupAdminImpl;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceHFileSplitterJob;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Table;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.junit.Assert;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.junit.ClassRule;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.junit.Test;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.junit.experimental.categories.Category;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.slf4j.Logger;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.slf4j.LoggerFactory;<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>@Category(LargeTests.class)<a name="line.54"></a>
-<span class="sourceLineNo">055</span>public class TestIncrementalBackupMergeWithFailures extends TestBackupBase {<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>  @ClassRule<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      HBaseClassTestRule.forClass(TestIncrementalBackupMergeWithFailures.class);<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static final Logger LOG =<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      LoggerFactory.getLogger(TestIncrementalBackupMergeWithFailures.class);<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  enum FailurePhase {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    PHASE1, PHASE2, PHASE3, PHASE4<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public final static String FAILURE_PHASE_KEY = "failurePhase";<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  static class BackupMergeJobWithFailures extends MapReduceBackupMergeJob {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    FailurePhase failurePhase;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>    @Override<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    public void setConf(Configuration conf) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      super.setConf(conf);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      String val = conf.get(FAILURE_PHASE_KEY);<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      if (val != null) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        failurePhase = FailurePhase.valueOf(val);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      } else {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        Assert.fail("Failure phase is not set");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      }<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>    /**<a name="line.84"></a>
-<span class="sourceLineNo">085</span>     * This is the exact copy of parent's run() with injections<a name="line.85"></a>
-<span class="sourceLineNo">086</span>     * of different types of failures<a name="line.86"></a>
-<span class="sourceLineNo">087</span>     */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    @Override<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    public void run(String[] backupIds) throws IOException {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      String bulkOutputConfKey;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>      // TODO : run player on remote cluster<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      player = new MapReduceHFileSplitterJob();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      bulkOutputConfKey = MapReduceHFileSplitterJob.BULK_OUTPUT_CONF_KEY;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      // Player reads all files in arbitrary directory structure and creates<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      // a Map task for each file<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      String bids = StringUtils.join(backupIds, ",");<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>      if (LOG.isDebugEnabled()) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        LOG.debug("Merge backup images " + bids);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>      List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList = new ArrayList&lt;&gt;();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      boolean finishedTables = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      BackupSystemTable table = new BackupSystemTable(conn);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      FileSystem fs = FileSystem.get(getConf());<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>      try {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        // Start backup exclusive operation<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        table.startBackupExclusiveOperation();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        // Start merge operation<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        table.startMergeOperation(backupIds);<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>        // Select most recent backup id<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        String mergedBackupId = findMostRecentBackupId(backupIds);<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>        TableName[] tableNames = getTableNamesInBackupImages(backupIds);<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>        BackupInfo bInfo = table.readBackupInfo(backupIds[0]);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        String backupRoot = bInfo.getBackupRootDir();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        // PHASE 1<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        checkFailure(FailurePhase.PHASE1);<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>        for (int i = 0; i &lt; tableNames.length; i++) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>          LOG.info("Merge backup images for " + tableNames[i]);<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>          // Find input directories for table<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          Path[] dirPaths = findInputDirectories(fs, backupRoot, tableNames[i], backupIds);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>          String dirs = StringUtils.join(dirPaths, ",");<a name="line.130"></a>
-<span class="sourceLineNo">131</span>          Path bulkOutputPath =<a name="line.131"></a>
-<span class="sourceLineNo">132</span>              BackupUtils.getBulkOutputDir(BackupUtils.getFileNameCompatibleString(tableNames[i]),<a name="line.132"></a>
-<span class="sourceLineNo">133</span>                getConf(), false);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>          // Delete content if exists<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          if (fs.exists(bulkOutputPath)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            if (!fs.delete(bulkOutputPath, true)) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>              LOG.warn("Can not delete: " + bulkOutputPath);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>            }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          Configuration conf = getConf();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          conf.set(bulkOutputConfKey, bulkOutputPath.toString());<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          String[] playerArgs = { dirs, tableNames[i].getNameAsString() };<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>          // PHASE 2<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          checkFailure(FailurePhase.PHASE2);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          player.setConf(getConf());<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          int result = player.run(playerArgs);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          if (succeeded(result)) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>            // Add to processed table list<a name="line.149"></a>
-<span class="sourceLineNo">150</span>            processedTableList.add(new Pair&lt;&gt;(tableNames[i], bulkOutputPath));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>          } else {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>            throw new IOException("Can not merge backup images for " + dirs<a name="line.152"></a>
-<span class="sourceLineNo">153</span>                + " (check Hadoop/MR and HBase logs). Player return code =" + result);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>          }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          LOG.debug("Merge Job finished:" + result);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        List&lt;TableName&gt; tableList = toTableNameList(processedTableList);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        // PHASE 3<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        checkFailure(FailurePhase.PHASE3);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        table.updateProcessedTablesForMerge(tableList);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        finishedTables = true;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>        // Move data<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        for (Pair&lt;TableName, Path&gt; tn : processedTableList) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          moveData(fs, backupRoot, tn.getSecond(), tn.getFirst(), mergedBackupId);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        // PHASE 4<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        checkFailure(FailurePhase.PHASE4);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        // Delete old data and update manifest<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        List&lt;String&gt; backupsToDelete = getBackupIdsToDelete(backupIds, mergedBackupId);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        deleteBackupImages(backupsToDelete, conn, fs, backupRoot);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        updateBackupManifest(backupRoot, mergedBackupId, backupsToDelete);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        // Finish merge session<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        table.finishMergeOperation();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      } catch (RuntimeException e) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        throw e;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      } catch (Exception e) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        LOG.error(e.toString(), e);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (!finishedTables) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>          // cleanup bulk directories and finish merge<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          // merge MUST be repeated (no need for repair)<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          cleanupBulkLoadDirs(fs, toPathList(processedTableList));<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          table.finishMergeOperation();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          table.finishBackupExclusiveOperation();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          throw new IOException("Backup merge operation failed, you should try it again", e);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        } else {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>          // backup repair must be run<a name="line.187"></a>
-<span class="sourceLineNo">188</span>          throw new IOException(<a name="line.188"></a>
-<span class="sourceLineNo">189</span>              "Backup merge operation failed, run backup repair tool to restore system's integrity",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>              e);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      } finally {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        table.close();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        conn.close();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>    private void checkFailure(FailurePhase phase) throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      if (failurePhase != null &amp;&amp; failurePhase == phase) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        throw new IOException(phase.toString());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public void TestIncBackupMergeRestore() throws Exception {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    int ADD_ROWS = 99;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // #1 - create full backup for all tables<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    LOG.info("create full backup image for all tables");<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1, table2);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    // Set custom Merge Job implementation<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    conf1.setClass(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      BackupMergeJobWithFailures.class, BackupMergeJob.class);<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    String backupIdFull = client.backupTables(request);<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.224"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.backup.impl.BackupCommands;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceHFileSplitterJob;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Table;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.junit.Assert;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.junit.ClassRule;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.junit.Test;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.junit.experimental.categories.Category;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.slf4j.Logger;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.slf4j.LoggerFactory;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>@Category(LargeTests.class)<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public class TestIncrementalBackupMergeWithFailures extends TestBackupBase {<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  @ClassRule<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      HBaseClassTestRule.forClass(TestIncrementalBackupMergeWithFailures.class);<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final Logger LOG =<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      LoggerFactory.getLogger(TestIncrementalBackupMergeWithFailures.class);<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  enum FailurePhase {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    PHASE1, PHASE2, PHASE3, PHASE4<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  }<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public final static String FAILURE_PHASE_KEY = "failurePhase";<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  static class BackupMergeJobWithFailures extends MapReduceBackupMergeJob {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    FailurePhase failurePhase;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>    @Override<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    public void setConf(Configuration conf) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      super.setConf(conf);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      String val = conf.get(FAILURE_PHASE_KEY);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      if (val != null) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        failurePhase = FailurePhase.valueOf(val);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      } else {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        Assert.fail("Failure phase is not set");<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>    /**<a name="line.85"></a>
+<span class="sourceLineNo">086</span>     * This is the exact copy of parent's run() with injections<a name="line.86"></a>
+<span class="sourceLineNo">087</span>     * of different types of failures<a name="line.87"></a>
+<span class="sourceLineNo">088</span>     */<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    @Override<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void run(String[] backupIds) throws IOException {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      String bulkOutputConfKey;<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>      // TODO : run player on remote cluster<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      player = new MapReduceHFileSplitterJob();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      bulkOutputConfKey = MapReduceHFileSplitterJob.BULK_OUTPUT_CONF_KEY;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      // Player reads all files in arbitrary directory structure and creates<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      // a Map task for each file<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      String bids = StringUtils.join(backupIds, ",");<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>      if (LOG.isDebugEnabled()) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        LOG.debug("Merge backup images " + bids);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>      List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList = new ArrayList&lt;&gt;();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      boolean finishedTables = false;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      BackupSystemTable table = new BackupSystemTable(conn);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      FileSystem fs = FileSystem.get(getConf());<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>      try {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        // Start backup exclusive operation<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        table.startBackupExclusiveOperation();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        // Start merge operation<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        table.startMergeOperation(backupIds);<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>        // Select most recent backup id<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>        TableName[] tableNames = getTableNamesInBackupImages(backupIds);<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>        BackupInfo bInfo = table.readBackupInfo(backupIds[0]);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        String backupRoot = bInfo.getBackupRootDir();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        // PHASE 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        checkFailure(FailurePhase.PHASE1);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>        for (int i = 0; i &lt; tableNames.length; i++) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>          LOG.info("Merge backup images for " + tableNames[i]);<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>          // Find input directories for table<a name="line.129"></a>
+<span class="sourceLineNo">130</span>          Path[] dirPaths = findInputDirectories(fs, backupRoot, tableNames[i], backupIds);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          String dirs = StringUtils.join(dirPaths, ",");<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          Path bulkOutputPath =<a name="line.132"></a>
+<span class="sourceLineNo">133</span>              BackupUtils.getBulkOutputDir(BackupUtils.getFileNameCompatibleString(tableNames[i]),<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                getConf(), false);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>          // Delete content if exists<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          if (fs.exists(bulkOutputPath)) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>            if (!fs.delete(bulkOutputPath, true)) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>              LOG.warn("Can not delete: " + bulkOutputPath);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>            }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>          }<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          Configuration conf = getConf();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          conf.set(bulkOutputConfKey, bulkOutputPath.toString());<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          String[] playerArgs = { dirs, tableNames[i].getNameAsString() };<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>          // PHASE 2<a name="line.145"></a>
+<span class="sourceLineNo">146</span>          checkFailure(FailurePhase.PHASE2);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          player.setConf(getConf());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          int result = player.run(playerArgs);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          if (succeeded(result)) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            // Add to processed table list<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            processedTableList.add(new Pair&lt;&gt;(tableNames[i], bulkOutputPath));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          } else {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>            throw new IOException("Can not merge backup images for " + dirs<a name="line.153"></a>
+<span class="sourceLineNo">154</span>                + " (check Hadoop/MR and HBase logs). Player return code =" + result);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          LOG.debug("Merge Job finished:" + result);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        List&lt;TableName&gt; tableList = toTableNameList(processedTableList);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        // PHASE 3<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        checkFailure(FailurePhase.PHASE3);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        table.updateProcessedTablesForMerge(tableList);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        finishedTables = true;<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>        // (modification of a backup file system)<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        // Move existing mergedBackupId data into tmp directory<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        // we will need it later in case of a failure<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        Path tmpBackupDir =  HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          mergedBackupId);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        Path backupDirPath = HBackupFileSystem.getBackupPath(backupRoot, mergedBackupId);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        if (!fs.rename(backupDirPath, tmpBackupDir)) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          throw new IOException("Failed to rename "+ backupDirPath +" to "+tmpBackupDir);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        } else {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          LOG.debug("Renamed "+ backupDirPath +" to "+ tmpBackupDir);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        // Move new data into backup dest<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        for (Pair&lt;TableName, Path&gt; tn : processedTableList) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          moveData(fs, backupRoot, tn.getSecond(), tn.getFirst(), mergedBackupId);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        }<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        checkFailure(FailurePhase.PHASE4);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        // Update backup manifest<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        List&lt;String&gt; backupsToDelete = getBackupIdsToDelete(backupIds, mergedBackupId);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        updateBackupManifest(tmpBackupDir.getParent().toString(), mergedBackupId, backupsToDelete);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        // Copy meta files back from tmp to backup dir<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        copyMetaData(fs, tmpBackupDir, backupDirPath);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        // Delete tmp dir (Rename back during repair)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        if (!fs.delete(tmpBackupDir, true)) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>          // WARN and ignore<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          LOG.warn("Could not delete tmp dir: "+ tmpBackupDir);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        }<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        // Delete old data<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        deleteBackupImages(backupsToDelete, conn, fs, backupRoot);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        // Finish merge session<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        table.finishMergeOperation();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        // Release lock<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        table.finishBackupExclusiveOperation();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (RuntimeException e) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        throw e;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      } catch (Exception e) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        LOG.error(e.toString(), e);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        if (!finishedTables) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          // cleanup bulk directories and finish merge<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          // merge MUST be repeated (no need for repair)<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          cleanupBulkLoadDirs(fs, toPathList(processedTableList));<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          table.finishMergeOperation();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          table.finishBackupExclusiveOperation();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          throw new IOException("Backup merge operation failed, you should try it again", e);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          // backup repair must be run<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          throw new IOException(<a name="line.209"></a>
+<span class="sourceLineNo">210</span>              "Backup merge operation failed, run backup repair tool to restore system's integrity",<a name="line.210"></a>
+<span class="sourceLineNo">211</span>              e);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      } finally {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        table.close();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        conn.close();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private void checkFailure(FailurePhase phase) throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (failurePhase != null &amp;&amp; failurePhase == phase) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        throw new IOException(phase.toString());<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
 <span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // #2 - insert some data to table1<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    HTable t1 = insertIntoTable(conn, table1, famName, 1, ADD_ROWS);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.debug("writing " + ADD_ROWS + " rows to " + table1);<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    t1.close();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table1);<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    HTable t2 = insertIntoTable(conn, table2, famName, 1, ADD_ROWS);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>    Assert.assertEquals(TEST_UTIL.countRows(t2), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    t2.close();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table2);<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>    // #3 - incremental backup for multiple tables<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    tables = Lists.newArrayList(table1, table2);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.243"></a>
+<span class="sourceLineNo">226</span>  @Test<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  public void TestIncBackupMergeRestore() throws Exception {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    int ADD_ROWS = 99;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    // #1 - create full backup for all tables<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    LOG.info("create full backup image for all tables");<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1, table2);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    // Set custom Merge Job implementation<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    conf1.setClass(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS,<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      BackupMergeJobWithFailures.class, BackupMergeJob.class);<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String backupIdFull = client.backupTables(request);<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.245"></a>
+<span class="sourceLineNo">245</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>    t1 = insertIntoTable(conn, table1, famName, 2, ADD_ROWS);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    t1.close();<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    t2 = insertIntoTable(conn, table2, famName, 2, ADD_ROWS);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    t2.close();<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    // #3 - incremental backup for multiple tables<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    String backupIdIncMultiple2 = client.backupTables(request);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    assertTrue(checkSucceeded(backupIdIncMultiple2));<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        // #4 Merge backup images with failures<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    for (FailurePhase phase : FailurePhase.values()) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      Configuration conf = conn.getConfiguration();<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>      conf.set(FAILURE_PHASE_KEY, phase.toString());<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>      try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        bAdmin.mergeBackups(backups);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        Assert.fail("Expected IOException");<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      } catch (IOException e) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        BackupSystemTable table = new BackupSystemTable(conn);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        if(phase.ordinal() &lt; FailurePhase.PHASE4.ordinal()) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          // No need to repair:<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          // Both Merge and backup exclusive operations are finished<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          assertFalse(table.isMergeInProgress());<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          try {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            table.finishBackupExclusiveOperation();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>            Assert.fail("IOException is expected");<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          } catch(IOException ee) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            // Expected<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        } else {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          // Repair is required<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          assertTrue(table.isMergeInProgress());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>            table.startBackupExclusiveOperation();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            Assert.fail("IOException is expected");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          } catch(IOException ee) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            // Expected - clean up before proceeding<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            table.finishMergeOperation();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            table.finishBackupExclusiveOperation();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        table.close();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        LOG.debug("Expected :"+ e.getMessage());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // Now merge w/o failures<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    Configuration conf = conn.getConfiguration();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    conf.unset(FAILURE_PHASE_KEY);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    conf.unset(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>    try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      bAdmin.mergeBackups(backups);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // #6 - restore incremental backup for multiple tables, with overwrite<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1, table2 };<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    TableName[] tablesMapIncMultiple = new TableName[] { table1_restore, table2_restore };<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple2, false,<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      tablesRestoreIncMultiple, tablesMapIncMultiple, true));<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    Table hTable = conn.getTable(table1_restore);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    LOG.debug("After incremental restore: " + hTable.getTableDescriptor());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    LOG.debug("f1 has " + TEST_UTIL.countRows(hTable, famName) + " rows");<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable, famName), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>    hTable.close();<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    hTable = conn.getTable(table2_restore);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    hTable.close();<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>    admin.close();<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    conn.close();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>}<a name="line.326"></a>
+<span class="sourceLineNo">247</span>    // #2 - insert some data to table1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HTable t1 = insertIntoTable(conn, table1, famName, 1, ADD_ROWS);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    LOG.debug("writing " + ADD_ROWS + " rows to " + table1);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    t1.close();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table1);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    HTable t2 = insertIntoTable(conn, table2, famName, 1, ADD_ROWS);<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    Assert.assertEquals(TEST_UTIL.countRows(t2), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    t2.close();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table2);<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // #3 - incremental backup for multiple tables<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    tables = Lists.newArrayList(table1, table2);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    t1 = insertIntoTable(conn, table1, famName, 2, ADD_ROWS);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    t1.close();<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>    t2 = insertIntoTable(conn, table2, famName, 2, ADD_ROWS);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    t2.close();<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    // #3 - incremental backup for multiple tables<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    String backupIdIncMultiple2 = client.backupTables(request);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    assertTrue(checkSucceeded(backupIdIncMultiple2));<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        // #4 Merge backup images with failures<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    for (FailurePhase phase : FailurePhase.values()) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Configuration conf = conn.getConfiguration();<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>      conf.set(FAILURE_PHASE_KEY, phase.toString());<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>      try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        bAdmin.mergeBackups(backups);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        Assert.fail("Expected IOException");<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      } catch (IOException e) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        BackupSystemTable table = new BackupSystemTable(conn);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        if(phase.ordinal() &lt; FailurePhase.PHASE4.ordinal()) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          // No need to repair:<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          // Both Merge and backup exclusive operations are finished<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          assertFalse(table.isMergeInProgress());<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            table.finishBackupExclusiveOperation();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            Assert.fail("IOException is expected");<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          } catch(IOException ee) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            // Expected<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        } else {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          // Repair is required<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          assertTrue(table.isMergeInProgress());<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>            table.startBackupExclusiveOperation();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            Assert.fail("IOException is expected");<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          } catch(IOException ee) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>            // Expected - clean up before proceeding<a name="line.308"></a>
+<span class="sourceLineNo">309</span>            //table.finishMergeOperation();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>            //table.finishBackupExclusiveOperation();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        table.close();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        LOG.debug("Expected :"+ e.getMessage());<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    // Now merge w/o failures<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    Configuration conf = conn.getConfiguration();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    conf.unset(FAILURE_PHASE_KEY);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    conf.unset(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    // Now run repair<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    BackupSystemTable sysTable = new BackupSystemTable(conn);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    BackupCommands.RepairCommand.repairFailedBackupMergeIfAny(conn, sysTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    // Now repeat merge<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      bAdmin.mergeBackups(backups);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    // #6 - restore incremental backup for multiple tables, with overwrite<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1, table2 };<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    TableName[] tablesMapIncMultiple = new TableName[] { table1_restore, table2_restore };<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple2, false,<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      tablesRestoreIncMultiple, tablesMapIncMultiple, true));<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Table hTable = conn.getTable(table1_restore);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    LOG.debug("After incremental restore: " + hTable.getTableDescriptor());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    LOG.debug("f1 has " + TEST_UTIL.countRows(hTable, famName) + " rows");<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable, famName), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>    hTable.close();<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    hTable = conn.getTable(table2_restore);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    hTable.close();<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>    admin.close();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    conn.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>}<a name="line.350"></a>
 
 
 


[19/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/util/class-use/Pair.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/class-use/Pair.html b/devapidocs/org/apache/hadoop/hbase/util/class-use/Pair.html
index 2cc219b..4f006f4 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/class-use/Pair.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/class-use/Pair.html
@@ -220,30 +220,34 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.rsgroup">org.apache.hadoop.hbase.rsgroup</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.visibility">org.apache.hadoop.hbase.security.visibility</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.snapshot">org.apache.hadoop.hbase.snapshot</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.visibility">org.apache.hadoop.hbase.security.visibility</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.tool">org.apache.hadoop.hbase.tool</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.snapshot">org.apache.hadoop.hbase.snapshot</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.util">org.apache.hadoop.hbase.util</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.tool">org.apache.hadoop.hbase.tool</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.wal">org.apache.hadoop.hbase.wal</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.util">org.apache.hadoop.hbase.util</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.wal">org.apache.hadoop.hbase.wal</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.zookeeper">org.apache.hadoop.hbase.zookeeper</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -1553,6 +1557,24 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tbody>
 </table>
 </li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.rsgroup">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a> in <a href="../../../../../../org/apache/hadoop/hbase/rsgroup/package-summary.html">org.apache.hadoop.hbase.rsgroup</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/rsgroup/package-summary.html">org.apache.hadoop.hbase.rsgroup</a> that return <a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&
 gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#correctAssignments-java.util.Map-">correctAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)</code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.security.access">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index eaf05de..598e51f 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -533,13 +533,13 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/util/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-use.html b/devapidocs/org/apache/hadoop/hbase/util/package-use.html
index 25c93ba..f363d7f 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-use.html
@@ -281,36 +281,40 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.rsgroup">org.apache.hadoop.hbase.rsgroup</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.visibility">org.apache.hadoop.hbase.security.visibility</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.snapshot">org.apache.hadoop.hbase.snapshot</a></td>
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.visibility">org.apache.hadoop.hbase.security.visibility</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.snapshot">org.apache.hadoop.hbase.snapshot</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.thrift">org.apache.hadoop.hbase.thrift</a></td>
 <td class="colLast">
 <div class="block">Provides an HBase <a href="http://incubator.apache.org/thrift/">Thrift</a>
 service.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.thrift2">org.apache.hadoop.hbase.thrift2</a></td>
 <td class="colLast">
 <div class="block">Provides an HBase <a href="http://thrift.apache.org/">Thrift</a>
 service.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.tool">org.apache.hadoop.hbase.tool</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.types">org.apache.hadoop.hbase.types</a></td>
 <td class="colLast">
 <div class="block">
@@ -318,19 +322,19 @@ service.</div>
  extensible data type API.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.util">org.apache.hadoop.hbase.util</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.util.hbck">org.apache.hadoop.hbase.util.hbck</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.wal">org.apache.hadoop.hbase.wal</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.zookeeper">org.apache.hadoop.hbase.zookeeper</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -1371,6 +1375,23 @@ service.</div>
 </tbody>
 </table>
 </li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.rsgroup">
+<!--   -->
+</a>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing classes, and an explanation">
+<caption><span>Classes in <a href="../../../../../org/apache/hadoop/hbase/util/package-summary.html">org.apache.hadoop.hbase.util</a> used by <a href="../../../../../org/apache/hadoop/hbase/rsgroup/package-summary.html">org.apache.hadoop.hbase.rsgroup</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Class and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/util/class-use/Pair.html#org.apache.hadoop.hbase.rsgroup">Pair</a>
+<div class="block">A generic class for pairs.</div>
+</td>
+</tr>
+</tbody>
+</table>
+</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.security.access">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index c0e28b4..9ec5b35 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -189,8 +189,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 71b6351..50f82c5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "45bbee4905fb031259c935502444c729b32ddac8";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "d5aaeee88b331e064830a2774f4fed238631457c";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Sat Mar 10 14:41:51 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sun Mar 11 14:41:48 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://asf920.gq1.ygridcore.net/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "ab48fe70c3185997530bec793561bd68";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "ab69d3995cfa81a49b4fd72d718151b5";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html
index d7c91d0..9f493ef 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html
@@ -71,85 +71,104 @@
 <span class="sourceLineNo">063</span>        + Path.SEPARATOR;<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  }<a name="line.64"></a>
 <span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public static String getTableBackupDataDir(String backupRootDir, String backupId,<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      TableName tableName) {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    return getTableBackupDir(backupRootDir, backupId, tableName) + Path.SEPARATOR + "data";<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  public static Path getBackupPath(String backupRootDir, String backupId) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    return new Path(backupRootDir + Path.SEPARATOR + backupId);<a name="line.72"></a>
+<span class="sourceLineNo">066</span>  /**<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * Get backup temporary directory<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * @param backupRootDir backup root<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * @return backup tmp directory path<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   */<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  public static Path getBackupTmpDirPath(String backupRootDir) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    return new Path(backupRootDir, ".tmp");<a name="line.72"></a>
 <span class="sourceLineNo">073</span>  }<a name="line.73"></a>
 <span class="sourceLineNo">074</span><a name="line.74"></a>
 <span class="sourceLineNo">075</span>  /**<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * Given the backup root dir, backup id and the table name, return the backup image location,<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * which is also where the backup manifest file is. return value look like:<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * "hdfs://backup.hbase.org:9000/user/biadmin/backup/backup_1396650096738/default/t1_dn/", where<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * "hdfs://backup.hbase.org:9000/user/biadmin/backup" is a backup root directory<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * @param backupRootPath backup root path<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   * @param tableName table name<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   * @param backupId backup Id<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * @return backupPath for the particular table<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public static Path getTableBackupPath(TableName tableName, Path backupRootPath, String backupId) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    return new Path(getTableBackupDir(backupRootPath.toString(), backupId, tableName));<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  /**<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * Given the backup root dir and the backup id, return the log file location for an incremental<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   * backup.<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * @param backupRootDir backup root directory<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param backupId backup id<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @return logBackupDir: ".../user/biadmin/backup/WALs/backup_1396650096738"<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static String getLogBackupDir(String backupRootDir, String backupId) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    return backupRootDir + Path.SEPARATOR + backupId + Path.SEPARATOR<a name="line.97"></a>
-<span class="sourceLineNo">098</span>        + HConstants.HREGION_LOGDIR_NAME;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  public static Path getLogBackupPath(String backupRootDir, String backupId) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return new Path(getLogBackupDir(backupRootDir, backupId));<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  // TODO we do not keep WAL files anymore<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  // Move manifest file to other place<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private static Path getManifestPath(Configuration conf, Path backupRootPath, String backupId)<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      throws IOException {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    FileSystem fs = backupRootPath.getFileSystem(conf);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    Path manifestPath =<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        new Path(getBackupPath(backupRootPath.toString(), backupId) + Path.SEPARATOR<a name="line.111"></a>
-<span class="sourceLineNo">112</span>            + BackupManifest.MANIFEST_FILE_NAME);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    if (!fs.exists(manifestPath)) {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      String errorMsg =<a name="line.114"></a>
-<span class="sourceLineNo">115</span>          "Could not find backup manifest " + BackupManifest.MANIFEST_FILE_NAME + " for "<a name="line.115"></a>
-<span class="sourceLineNo">116</span>              + backupId + ". File " + manifestPath + " does not exists. Did " + backupId<a name="line.116"></a>
-<span class="sourceLineNo">117</span>              + " correspond to previously taken backup ?";<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      throw new IOException(errorMsg);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return manifestPath;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public static BackupManifest<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      getManifest(Configuration conf, Path backupRootPath, String backupId) throws IOException {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    BackupManifest manifest =<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        new BackupManifest(conf, getManifestPath(conf, backupRootPath, backupId));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    return manifest;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * Check whether the backup image path and there is manifest file in the path.<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param backupManifestMap If all the manifests are found, then they are put into this map<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param tableArray the tables involved<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @throws IOException exception<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  public static void checkImageManifestExist(HashMap&lt;TableName, BackupManifest&gt; backupManifestMap,<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      TableName[] tableArray, Configuration conf, Path backupRootPath, String backupId)<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      throws IOException {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    for (TableName tableName : tableArray) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      BackupManifest manifest = getManifest(conf, backupRootPath, backupId);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      backupManifestMap.put(tableName, manifest);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>}<a name="line.144"></a>
+<span class="sourceLineNo">076</span>   * Get backup tmp directory for backupId<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * @param backupRoot backup root<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * @param backupId backup id<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * @return backup tmp directory path<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  public static Path getBackupTmpDirPathForBackupId(String backupRoot, String backupId) {<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    return new Path(getBackupTmpDirPath(backupRoot), backupId);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  public static String getTableBackupDataDir(String backupRootDir, String backupId,<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      TableName tableName) {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    return getTableBackupDir(backupRootDir, backupId, tableName) + Path.SEPARATOR + "data";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static Path getBackupPath(String backupRootDir, String backupId) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    return new Path(backupRootDir + Path.SEPARATOR + backupId);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  /**<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * Given the backup root dir, backup id and the table name, return the backup image location,<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * which is also where the backup manifest file is. return value look like:<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * "hdfs://backup.hbase.org:9000/user/biadmin/backup/backup_1396650096738/default/t1_dn/", where<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * "hdfs://backup.hbase.org:9000/user/biadmin/backup" is a backup root directory<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * @param backupRootPath backup root path<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * @param tableName table name<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @param backupId backup Id<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @return backupPath for the particular table<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  public static Path getTableBackupPath(TableName tableName, Path backupRootPath, String backupId) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    return new Path(getTableBackupDir(backupRootPath.toString(), backupId, tableName));<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  /**<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * Given the backup root dir and the backup id, return the log file location for an incremental<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * backup.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   * @param backupRootDir backup root directory<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * @param backupId backup id<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @return logBackupDir: ".../user/biadmin/backup/WALs/backup_1396650096738"<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   */<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public static String getLogBackupDir(String backupRootDir, String backupId) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    return backupRootDir + Path.SEPARATOR + backupId + Path.SEPARATOR<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        + HConstants.HREGION_LOGDIR_NAME;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  public static Path getLogBackupPath(String backupRootDir, String backupId) {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    return new Path(getLogBackupDir(backupRootDir, backupId));<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  // TODO we do not keep WAL files anymore<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  // Move manifest file to other place<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private static Path getManifestPath(Configuration conf, Path backupRootPath, String backupId)<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      throws IOException {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    FileSystem fs = backupRootPath.getFileSystem(conf);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    Path manifestPath =<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        new Path(getBackupPath(backupRootPath.toString(), backupId) + Path.SEPARATOR<a name="line.130"></a>
+<span class="sourceLineNo">131</span>            + BackupManifest.MANIFEST_FILE_NAME);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (!fs.exists(manifestPath)) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      String errorMsg =<a name="line.133"></a>
+<span class="sourceLineNo">134</span>          "Could not find backup manifest " + BackupManifest.MANIFEST_FILE_NAME + " for "<a name="line.134"></a>
+<span class="sourceLineNo">135</span>              + backupId + ". File " + manifestPath + " does not exists. Did " + backupId<a name="line.135"></a>
+<span class="sourceLineNo">136</span>              + " correspond to previously taken backup ?";<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      throw new IOException(errorMsg);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    }<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    return manifestPath;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static BackupManifest<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      getManifest(Configuration conf, Path backupRootPath, String backupId) throws IOException {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    BackupManifest manifest =<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        new BackupManifest(conf, getManifestPath(conf, backupRootPath, backupId));<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    return manifest;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  /**<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   * Check whether the backup image path and there is manifest file in the path.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @param backupManifestMap If all the manifests are found, then they are put into this map<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param tableArray the tables involved<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * @throws IOException exception<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public static void checkImageManifestExist(HashMap&lt;TableName, BackupManifest&gt; backupManifestMap,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      TableName[] tableArray, Configuration conf, Path backupRootPath, String backupId)<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      throws IOException {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    for (TableName tableName : tableArray) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      BackupManifest manifest = getManifest(conf, backupRootPath, backupId);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      backupManifestMap.put(tableName, manifest);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span>}<a name="line.163"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html
index 12f4f50..918c8a0 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html
@@ -627,103 +627,104 @@
 <span class="sourceLineNo">619</span>  public void mergeBackups(String[] backupIds) throws IOException {<a name="line.619"></a>
 <span class="sourceLineNo">620</span>    try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.620"></a>
 <span class="sourceLineNo">621</span>      checkIfValidForMerge(backupIds, sysTable);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      BackupMergeJob job = BackupRestoreFactory.getBackupMergeJob(conn.getConfiguration());<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      job.run(backupIds);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  }<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>  /**<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * Verifies that backup images are valid for merge.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   *<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;ul&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;li&gt;All backups MUST be in the same destination<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * &lt;li&gt;No FULL backups are allowed - only INCREMENTAL<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * &lt;li&gt;All backups must be in COMPLETE state<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * &lt;li&gt;No holes in backup list are allowed<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * &lt;p&gt;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * @param backupIds list of backup ids<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @param table backup system table<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   * @throws IOException if the backup image is not valid for merge<a name="line.639"></a>
-<span class="sourceLineNo">640</span>   */<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  private void checkIfValidForMerge(String[] backupIds, BackupSystemTable table)<a name="line.641"></a>
-<span class="sourceLineNo">642</span>          throws IOException {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    String backupRoot = null;<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>    final Set&lt;TableName&gt; allTables = new HashSet&lt;&gt;();<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    final Set&lt;String&gt; allBackups = new HashSet&lt;&gt;();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    long minTime = Long.MAX_VALUE, maxTime = Long.MIN_VALUE;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    for (String backupId : backupIds) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      BackupInfo bInfo = table.readBackupInfo(backupId);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      if (bInfo == null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        String msg = "Backup session " + backupId + " not found";<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        throw new IOException(msg);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (backupRoot == null) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        backupRoot = bInfo.getBackupRootDir();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      } else if (!bInfo.getBackupRootDir().equals(backupRoot)) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        throw new IOException("Found different backup destinations in a list of a backup sessions "<a name="line.657"></a>
-<span class="sourceLineNo">658</span>                + "\n1. " + backupRoot + "\n" + "2. " + bInfo.getBackupRootDir());<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      if (bInfo.getType() == BackupType.FULL) {<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        throw new IOException("FULL backup image can not be merged for: \n" + bInfo);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>      if (bInfo.getState() != BackupState.COMPLETE) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        throw new IOException("Backup image " + backupId<a name="line.665"></a>
-<span class="sourceLineNo">666</span>            + " can not be merged becuase of its state: " + bInfo.getState());<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      allBackups.add(backupId);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      allTables.addAll(bInfo.getTableNames());<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      long time = bInfo.getStartTs();<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      if (time &lt; minTime) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        minTime = time;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      if (time &gt; maxTime) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>        maxTime = time;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    final long startRangeTime  = minTime;<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    final long endRangeTime = maxTime;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    final String backupDest = backupRoot;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Check we have no 'holes' in backup id list<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    // Filter 1 : backupRoot<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    // Filter 2 : time range filter<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    // Filter 3 : table filter<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    BackupInfo.Filter destinationFilter = info -&gt; info.getBackupRootDir().equals(backupDest);<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>    BackupInfo.Filter timeRangeFilter = info -&gt; {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      long time = info.getStartTs();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      return time &gt;= startRangeTime &amp;&amp; time &lt;= endRangeTime ;<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    };<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>    BackupInfo.Filter tableFilter = info -&gt; {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      List&lt;TableName&gt; tables = info.getTableNames();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      return !Collections.disjoint(allTables, tables);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    };<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    BackupInfo.Filter typeFilter = info -&gt; info.getType() == BackupType.INCREMENTAL;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    BackupInfo.Filter stateFilter = info -&gt; info.getState() == BackupState.COMPLETE;<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    List&lt;BackupInfo&gt; allInfos = table.getBackupHistory(-1, destinationFilter,<a name="line.701"></a>
-<span class="sourceLineNo">702</span>          timeRangeFilter, tableFilter, typeFilter, stateFilter);<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (allInfos.size() != allBackups.size()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      // Yes we have at least one  hole in backup image sequence<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      List&lt;String&gt; missingIds = new ArrayList&lt;&gt;();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for(BackupInfo info: allInfos) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        if(allBackups.contains(info.getBackupId())) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>          continue;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        missingIds.add(info.getBackupId());<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      String errMsg =<a name="line.712"></a>
-<span class="sourceLineNo">713</span>          "Sequence of backup ids has 'holes'. The following backup images must be added:" +<a name="line.713"></a>
-<span class="sourceLineNo">714</span>           org.apache.hadoop.util.StringUtils.join(",", missingIds);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      throw new IOException(errMsg);<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    }<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>}<a name="line.718"></a>
+<span class="sourceLineNo">622</span>      //TODO run job on remote cluster<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      BackupMergeJob job = BackupRestoreFactory.getBackupMergeJob(conn.getConfiguration());<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      job.run(backupIds);<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>  }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>  /**<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * Verifies that backup images are valid for merge.<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   *<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * &lt;ul&gt;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;li&gt;All backups MUST be in the same destination<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;No FULL backups are allowed - only INCREMENTAL<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;All backups must be in COMPLETE state<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;li&gt;No holes in backup list are allowed<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * &lt;/ul&gt;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * &lt;p&gt;<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * @param backupIds list of backup ids<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param table backup system table<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @throws IOException if the backup image is not valid for merge<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   */<a name="line.641"></a>
+<span class="sourceLineNo">642</span>  private void checkIfValidForMerge(String[] backupIds, BackupSystemTable table)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>          throws IOException {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    String backupRoot = null;<a name="line.644"></a>
+<span class="sourceLineNo">645</span><a name="line.645"></a>
+<span class="sourceLineNo">646</span>    final Set&lt;TableName&gt; allTables = new HashSet&lt;&gt;();<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    final Set&lt;String&gt; allBackups = new HashSet&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    long minTime = Long.MAX_VALUE, maxTime = Long.MIN_VALUE;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    for (String backupId : backupIds) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      BackupInfo bInfo = table.readBackupInfo(backupId);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      if (bInfo == null) {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>        String msg = "Backup session " + backupId + " not found";<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        throw new IOException(msg);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      if (backupRoot == null) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        backupRoot = bInfo.getBackupRootDir();<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      } else if (!bInfo.getBackupRootDir().equals(backupRoot)) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        throw new IOException("Found different backup destinations in a list of a backup sessions "<a name="line.658"></a>
+<span class="sourceLineNo">659</span>                + "\n1. " + backupRoot + "\n" + "2. " + bInfo.getBackupRootDir());<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      if (bInfo.getType() == BackupType.FULL) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        throw new IOException("FULL backup image can not be merged for: \n" + bInfo);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      }<a name="line.663"></a>
+<span class="sourceLineNo">664</span><a name="line.664"></a>
+<span class="sourceLineNo">665</span>      if (bInfo.getState() != BackupState.COMPLETE) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        throw new IOException("Backup image " + backupId<a name="line.666"></a>
+<span class="sourceLineNo">667</span>            + " can not be merged becuase of its state: " + bInfo.getState());<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
+<span class="sourceLineNo">669</span>      allBackups.add(backupId);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>      allTables.addAll(bInfo.getTableNames());<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      long time = bInfo.getStartTs();<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      if (time &lt; minTime) {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        minTime = time;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      if (time &gt; maxTime) {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>        maxTime = time;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      }<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    }<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    final long startRangeTime  = minTime;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    final long endRangeTime = maxTime;<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    final String backupDest = backupRoot;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    // Check we have no 'holes' in backup id list<a name="line.683"></a>
+<span class="sourceLineNo">684</span>    // Filter 1 : backupRoot<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    // Filter 2 : time range filter<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    // Filter 3 : table filter<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    BackupInfo.Filter destinationFilter = info -&gt; info.getBackupRootDir().equals(backupDest);<a name="line.687"></a>
+<span class="sourceLineNo">688</span><a name="line.688"></a>
+<span class="sourceLineNo">689</span>    BackupInfo.Filter timeRangeFilter = info -&gt; {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      long time = info.getStartTs();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      return time &gt;= startRangeTime &amp;&amp; time &lt;= endRangeTime ;<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    };<a name="line.692"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    BackupInfo.Filter tableFilter = info -&gt; {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      List&lt;TableName&gt; tables = info.getTableNames();<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      return !Collections.disjoint(allTables, tables);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    };<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    BackupInfo.Filter typeFilter = info -&gt; info.getType() == BackupType.INCREMENTAL;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    BackupInfo.Filter stateFilter = info -&gt; info.getState() == BackupState.COMPLETE;<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>    List&lt;BackupInfo&gt; allInfos = table.getBackupHistory(-1, destinationFilter,<a name="line.702"></a>
+<span class="sourceLineNo">703</span>          timeRangeFilter, tableFilter, typeFilter, stateFilter);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    if (allInfos.size() != allBackups.size()) {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      // Yes we have at least one  hole in backup image sequence<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      List&lt;String&gt; missingIds = new ArrayList&lt;&gt;();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      for(BackupInfo info: allInfos) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>        if(allBackups.contains(info.getBackupId())) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>          continue;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>        }<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        missingIds.add(info.getBackupId());<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      String errMsg =<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          "Sequence of backup ids has 'holes'. The following backup images must be added:" +<a name="line.714"></a>
+<span class="sourceLineNo">715</span>           org.apache.hadoop.util.StringUtils.join(",", missingIds);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      throw new IOException(errMsg);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
+<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>}<a name="line.719"></a>
 
 
 


[21/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
index 57ce04e..c36dd6e 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
@@ -5879,11 +5879,6 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#findServerForRegion-java.util.Map-org.apache.hadoop.hbase.client.RegionInfo-">findServerForRegion</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments,
-                   <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
@@ -5898,7 +5893,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
+<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&gt;</code></
 td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#correctAssignments-java.util.Map-">correctAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
@@ -5980,7 +5975,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;clusterState)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
+<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&gt;</code></
 td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#correctAssignments-java.util.Map-">correctAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
@@ -5996,61 +5991,56 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#findServerForRegion-java.util.Map-org.apache.hadoop.hbase.client.RegionInfo-">findServerForRegion</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments,
-                   <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#generateGroupMaps-java.util.List-java.util.List-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-">generateGroupMaps</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionMap,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverMap)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#generateGroupMaps-java.util.List-java.util.List-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-">generateGroupMaps</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionMap,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverMap)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#getMisplacedRegions-java.util.Map-">getMisplacedRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupAdminEndpoint.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#postClearDeadServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.List-">postClearDeadServers</a></span>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;notClearedServers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupAdminEndpoint.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#postClearDeadServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.List-">postClearDeadServers</a></span>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;notClearedServers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="i
 nterface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nbsp;clusterLoad)</code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
index bf39f44..4e104f3 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/Connection.html
@@ -896,7 +896,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                                <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;sysTable)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private void</code></td>
+<td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="typeNameLabel">BackupCommands.RepairCommand.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#repairFailedBackupMergeIfAny-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.backup.impl.BackupSystemTable-">repairFailedBackupMergeIfAny</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
                             <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;sysTable)</code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
index 5955f86..2769629 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
@@ -5607,7 +5607,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&
 gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#correctAssignments-java.util.Map-">correctAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
@@ -5647,32 +5647,27 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
          <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#findServerForRegion-java.util.Map-org.apache.hadoop.hbase.client.RegionInfo-">findServerForRegion</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments,
-                   <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupAdminEndpoint.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#postCreateTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.TableDescriptor-org.apache.hadoop.hbase.client.RegionInfo:A-">postCreateTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc,
                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupAdminEndpoint.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#preCreateTableAction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.TableDescriptor-org.apache.hadoop.hbase.client.RegionInfo:A-">preCreateTableAction</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                     <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc,
                     <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>&nbsp;</td>
@@ -5701,43 +5696,38 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;clusterState)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&
 gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#correctAssignments-java.util.Map-">correctAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#findServerForRegion-java.util.Map-org.apache.hadoop.hbase.client.RegionInfo-">findServerForRegion</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments,
-                   <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#generateGroupMaps-java.util.List-java.util.List-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-">generateGroupMaps</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionMap,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverMap)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#generateGroupMaps-java.util.List-java.util.List-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-">generateGroupMaps</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionMap,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverMap)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#getMisplacedRegions-java.util.Map-">getMisplacedRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.ht
 ml" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nbsp;clusterLoad)</code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 2fd66b0..c2bc618 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -547,24 +547,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index a012350..3d763ae 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,14 +183,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index fea7a14..98ae71a 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -273,12 +273,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 7600159..29a79fd 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -349,9 +349,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 626507e..730b7cf 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -294,9 +294,9 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/master/class-use/RegionPlan.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/class-use/RegionPlan.html b/devapidocs/org/apache/hadoop/hbase/master/class-use/RegionPlan.html
index f5c3b0f..61e9d1b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/class-use/RegionPlan.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/class-use/RegionPlan.html
@@ -392,6 +392,10 @@
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#balanceCluster-org.apache.hadoop.hbase.TableName-java.util.Map-">balanceCluster</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;clusterState)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&
 gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#correctAssignments-java.util.Map-">correctAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)</code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index fbf828f..1d17a5c 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -346,9 +346,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 0fa081d..550d779 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -209,8 +209,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index fc940b8..1132642 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -442,19 +442,19 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ProcedureState.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ProcedureState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ProcedureState.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ProcedureState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 79bccf0..c6d8d97 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -212,11 +212,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 </ul>
 </li>
 </ul>


[08/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[09/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[14/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[11/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[03/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html
index e82daed..478e1af 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html
@@ -39,299 +39,323 @@
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.TableName;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.backup.impl.BackupAdminImpl;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceHFileSplitterJob;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Table;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.junit.Assert;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.junit.ClassRule;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.junit.Test;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.junit.experimental.categories.Category;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.slf4j.Logger;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.slf4j.LoggerFactory;<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>@Category(LargeTests.class)<a name="line.54"></a>
-<span class="sourceLineNo">055</span>public class TestIncrementalBackupMergeWithFailures extends TestBackupBase {<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>  @ClassRule<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      HBaseClassTestRule.forClass(TestIncrementalBackupMergeWithFailures.class);<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static final Logger LOG =<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      LoggerFactory.getLogger(TestIncrementalBackupMergeWithFailures.class);<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  enum FailurePhase {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    PHASE1, PHASE2, PHASE3, PHASE4<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public final static String FAILURE_PHASE_KEY = "failurePhase";<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  static class BackupMergeJobWithFailures extends MapReduceBackupMergeJob {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    FailurePhase failurePhase;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>    @Override<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    public void setConf(Configuration conf) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      super.setConf(conf);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      String val = conf.get(FAILURE_PHASE_KEY);<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      if (val != null) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        failurePhase = FailurePhase.valueOf(val);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      } else {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        Assert.fail("Failure phase is not set");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      }<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>    /**<a name="line.84"></a>
-<span class="sourceLineNo">085</span>     * This is the exact copy of parent's run() with injections<a name="line.85"></a>
-<span class="sourceLineNo">086</span>     * of different types of failures<a name="line.86"></a>
-<span class="sourceLineNo">087</span>     */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    @Override<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    public void run(String[] backupIds) throws IOException {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      String bulkOutputConfKey;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>      // TODO : run player on remote cluster<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      player = new MapReduceHFileSplitterJob();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      bulkOutputConfKey = MapReduceHFileSplitterJob.BULK_OUTPUT_CONF_KEY;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      // Player reads all files in arbitrary directory structure and creates<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      // a Map task for each file<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      String bids = StringUtils.join(backupIds, ",");<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>      if (LOG.isDebugEnabled()) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        LOG.debug("Merge backup images " + bids);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>      List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList = new ArrayList&lt;&gt;();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      boolean finishedTables = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      BackupSystemTable table = new BackupSystemTable(conn);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      FileSystem fs = FileSystem.get(getConf());<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>      try {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        // Start backup exclusive operation<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        table.startBackupExclusiveOperation();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        // Start merge operation<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        table.startMergeOperation(backupIds);<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>        // Select most recent backup id<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        String mergedBackupId = findMostRecentBackupId(backupIds);<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>        TableName[] tableNames = getTableNamesInBackupImages(backupIds);<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>        BackupInfo bInfo = table.readBackupInfo(backupIds[0]);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        String backupRoot = bInfo.getBackupRootDir();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        // PHASE 1<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        checkFailure(FailurePhase.PHASE1);<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>        for (int i = 0; i &lt; tableNames.length; i++) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>          LOG.info("Merge backup images for " + tableNames[i]);<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>          // Find input directories for table<a name="line.128"></a>
-<span class="sourceLineNo">129</span>          Path[] dirPaths = findInputDirectories(fs, backupRoot, tableNames[i], backupIds);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>          String dirs = StringUtils.join(dirPaths, ",");<a name="line.130"></a>
-<span class="sourceLineNo">131</span>          Path bulkOutputPath =<a name="line.131"></a>
-<span class="sourceLineNo">132</span>              BackupUtils.getBulkOutputDir(BackupUtils.getFileNameCompatibleString(tableNames[i]),<a name="line.132"></a>
-<span class="sourceLineNo">133</span>                getConf(), false);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>          // Delete content if exists<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          if (fs.exists(bulkOutputPath)) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            if (!fs.delete(bulkOutputPath, true)) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>              LOG.warn("Can not delete: " + bulkOutputPath);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>            }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          Configuration conf = getConf();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          conf.set(bulkOutputConfKey, bulkOutputPath.toString());<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          String[] playerArgs = { dirs, tableNames[i].getNameAsString() };<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>          // PHASE 2<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          checkFailure(FailurePhase.PHASE2);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          player.setConf(getConf());<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          int result = player.run(playerArgs);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          if (succeeded(result)) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>            // Add to processed table list<a name="line.149"></a>
-<span class="sourceLineNo">150</span>            processedTableList.add(new Pair&lt;&gt;(tableNames[i], bulkOutputPath));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>          } else {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>            throw new IOException("Can not merge backup images for " + dirs<a name="line.152"></a>
-<span class="sourceLineNo">153</span>                + " (check Hadoop/MR and HBase logs). Player return code =" + result);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>          }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          LOG.debug("Merge Job finished:" + result);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        List&lt;TableName&gt; tableList = toTableNameList(processedTableList);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        // PHASE 3<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        checkFailure(FailurePhase.PHASE3);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        table.updateProcessedTablesForMerge(tableList);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        finishedTables = true;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>        // Move data<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        for (Pair&lt;TableName, Path&gt; tn : processedTableList) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          moveData(fs, backupRoot, tn.getSecond(), tn.getFirst(), mergedBackupId);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        // PHASE 4<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        checkFailure(FailurePhase.PHASE4);<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        // Delete old data and update manifest<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        List&lt;String&gt; backupsToDelete = getBackupIdsToDelete(backupIds, mergedBackupId);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        deleteBackupImages(backupsToDelete, conn, fs, backupRoot);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        updateBackupManifest(backupRoot, mergedBackupId, backupsToDelete);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        // Finish merge session<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        table.finishMergeOperation();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      } catch (RuntimeException e) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        throw e;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      } catch (Exception e) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        LOG.error(e.toString(), e);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (!finishedTables) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>          // cleanup bulk directories and finish merge<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          // merge MUST be repeated (no need for repair)<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          cleanupBulkLoadDirs(fs, toPathList(processedTableList));<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          table.finishMergeOperation();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          table.finishBackupExclusiveOperation();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          throw new IOException("Backup merge operation failed, you should try it again", e);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        } else {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>          // backup repair must be run<a name="line.187"></a>
-<span class="sourceLineNo">188</span>          throw new IOException(<a name="line.188"></a>
-<span class="sourceLineNo">189</span>              "Backup merge operation failed, run backup repair tool to restore system's integrity",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>              e);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      } finally {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        table.close();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        conn.close();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>    private void checkFailure(FailurePhase phase) throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      if (failurePhase != null &amp;&amp; failurePhase == phase) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        throw new IOException(phase.toString());<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public void TestIncBackupMergeRestore() throws Exception {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    int ADD_ROWS = 99;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // #1 - create full backup for all tables<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    LOG.info("create full backup image for all tables");<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1, table2);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    // Set custom Merge Job implementation<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    conf1.setClass(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      BackupMergeJobWithFailures.class, BackupMergeJob.class);<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    String backupIdFull = client.backupTables(request);<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.224"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.backup.impl.BackupCommands;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceBackupMergeJob;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.backup.mapreduce.MapReduceHFileSplitterJob;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Table;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.junit.Assert;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.junit.ClassRule;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.junit.Test;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.junit.experimental.categories.Category;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.slf4j.Logger;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.slf4j.LoggerFactory;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>@Category(LargeTests.class)<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public class TestIncrementalBackupMergeWithFailures extends TestBackupBase {<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  @ClassRule<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      HBaseClassTestRule.forClass(TestIncrementalBackupMergeWithFailures.class);<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final Logger LOG =<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      LoggerFactory.getLogger(TestIncrementalBackupMergeWithFailures.class);<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  enum FailurePhase {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    PHASE1, PHASE2, PHASE3, PHASE4<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  }<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  public final static String FAILURE_PHASE_KEY = "failurePhase";<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  static class BackupMergeJobWithFailures extends MapReduceBackupMergeJob {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    FailurePhase failurePhase;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>    @Override<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    public void setConf(Configuration conf) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      super.setConf(conf);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      String val = conf.get(FAILURE_PHASE_KEY);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      if (val != null) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        failurePhase = FailurePhase.valueOf(val);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      } else {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        Assert.fail("Failure phase is not set");<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>    /**<a name="line.85"></a>
+<span class="sourceLineNo">086</span>     * This is the exact copy of parent's run() with injections<a name="line.86"></a>
+<span class="sourceLineNo">087</span>     * of different types of failures<a name="line.87"></a>
+<span class="sourceLineNo">088</span>     */<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    @Override<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void run(String[] backupIds) throws IOException {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      String bulkOutputConfKey;<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>      // TODO : run player on remote cluster<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      player = new MapReduceHFileSplitterJob();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      bulkOutputConfKey = MapReduceHFileSplitterJob.BULK_OUTPUT_CONF_KEY;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      // Player reads all files in arbitrary directory structure and creates<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      // a Map task for each file<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      String bids = StringUtils.join(backupIds, ",");<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>      if (LOG.isDebugEnabled()) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        LOG.debug("Merge backup images " + bids);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>      List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList = new ArrayList&lt;&gt;();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      boolean finishedTables = false;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      Connection conn = ConnectionFactory.createConnection(getConf());<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      BackupSystemTable table = new BackupSystemTable(conn);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      FileSystem fs = FileSystem.get(getConf());<a name="line.108"></a>
+<span class="sourceLineNo">109</span><a name="line.109"></a>
+<span class="sourceLineNo">110</span>      try {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        // Start backup exclusive operation<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        table.startBackupExclusiveOperation();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        // Start merge operation<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        table.startMergeOperation(backupIds);<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>        // Select most recent backup id<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>        TableName[] tableNames = getTableNamesInBackupImages(backupIds);<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>        BackupInfo bInfo = table.readBackupInfo(backupIds[0]);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        String backupRoot = bInfo.getBackupRootDir();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        // PHASE 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        checkFailure(FailurePhase.PHASE1);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>        for (int i = 0; i &lt; tableNames.length; i++) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>          LOG.info("Merge backup images for " + tableNames[i]);<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>          // Find input directories for table<a name="line.129"></a>
+<span class="sourceLineNo">130</span>          Path[] dirPaths = findInputDirectories(fs, backupRoot, tableNames[i], backupIds);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          String dirs = StringUtils.join(dirPaths, ",");<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          Path bulkOutputPath =<a name="line.132"></a>
+<span class="sourceLineNo">133</span>              BackupUtils.getBulkOutputDir(BackupUtils.getFileNameCompatibleString(tableNames[i]),<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                getConf(), false);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>          // Delete content if exists<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          if (fs.exists(bulkOutputPath)) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>            if (!fs.delete(bulkOutputPath, true)) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>              LOG.warn("Can not delete: " + bulkOutputPath);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>            }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>          }<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          Configuration conf = getConf();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          conf.set(bulkOutputConfKey, bulkOutputPath.toString());<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          String[] playerArgs = { dirs, tableNames[i].getNameAsString() };<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>          // PHASE 2<a name="line.145"></a>
+<span class="sourceLineNo">146</span>          checkFailure(FailurePhase.PHASE2);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          player.setConf(getConf());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          int result = player.run(playerArgs);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          if (succeeded(result)) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            // Add to processed table list<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            processedTableList.add(new Pair&lt;&gt;(tableNames[i], bulkOutputPath));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          } else {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>            throw new IOException("Can not merge backup images for " + dirs<a name="line.153"></a>
+<span class="sourceLineNo">154</span>                + " (check Hadoop/MR and HBase logs). Player return code =" + result);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          LOG.debug("Merge Job finished:" + result);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        List&lt;TableName&gt; tableList = toTableNameList(processedTableList);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        // PHASE 3<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        checkFailure(FailurePhase.PHASE3);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        table.updateProcessedTablesForMerge(tableList);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        finishedTables = true;<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>        // (modification of a backup file system)<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        // Move existing mergedBackupId data into tmp directory<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        // we will need it later in case of a failure<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        Path tmpBackupDir =  HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          mergedBackupId);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        Path backupDirPath = HBackupFileSystem.getBackupPath(backupRoot, mergedBackupId);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        if (!fs.rename(backupDirPath, tmpBackupDir)) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          throw new IOException("Failed to rename "+ backupDirPath +" to "+tmpBackupDir);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        } else {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          LOG.debug("Renamed "+ backupDirPath +" to "+ tmpBackupDir);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        // Move new data into backup dest<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        for (Pair&lt;TableName, Path&gt; tn : processedTableList) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          moveData(fs, backupRoot, tn.getSecond(), tn.getFirst(), mergedBackupId);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        }<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        checkFailure(FailurePhase.PHASE4);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        // Update backup manifest<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        List&lt;String&gt; backupsToDelete = getBackupIdsToDelete(backupIds, mergedBackupId);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        updateBackupManifest(tmpBackupDir.getParent().toString(), mergedBackupId, backupsToDelete);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        // Copy meta files back from tmp to backup dir<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        copyMetaData(fs, tmpBackupDir, backupDirPath);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        // Delete tmp dir (Rename back during repair)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        if (!fs.delete(tmpBackupDir, true)) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>          // WARN and ignore<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          LOG.warn("Could not delete tmp dir: "+ tmpBackupDir);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        }<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        // Delete old data<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        deleteBackupImages(backupsToDelete, conn, fs, backupRoot);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        // Finish merge session<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        table.finishMergeOperation();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        // Release lock<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        table.finishBackupExclusiveOperation();<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      } catch (RuntimeException e) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        throw e;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      } catch (Exception e) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        LOG.error(e.toString(), e);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        if (!finishedTables) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          // cleanup bulk directories and finish merge<a name="line.201"></a>
+<span class="sourceLineNo">202</span>          // merge MUST be repeated (no need for repair)<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          cleanupBulkLoadDirs(fs, toPathList(processedTableList));<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          table.finishMergeOperation();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          table.finishBackupExclusiveOperation();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          throw new IOException("Backup merge operation failed, you should try it again", e);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        } else {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          // backup repair must be run<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          throw new IOException(<a name="line.209"></a>
+<span class="sourceLineNo">210</span>              "Backup merge operation failed, run backup repair tool to restore system's integrity",<a name="line.210"></a>
+<span class="sourceLineNo">211</span>              e);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      } finally {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        table.close();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        conn.close();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private void checkFailure(FailurePhase phase) throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (failurePhase != null &amp;&amp; failurePhase == phase) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        throw new IOException(phase.toString());<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
 <span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // #2 - insert some data to table1<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    HTable t1 = insertIntoTable(conn, table1, famName, 1, ADD_ROWS);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.debug("writing " + ADD_ROWS + " rows to " + table1);<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    t1.close();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table1);<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    HTable t2 = insertIntoTable(conn, table2, famName, 1, ADD_ROWS);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>    Assert.assertEquals(TEST_UTIL.countRows(t2), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    t2.close();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table2);<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>    // #3 - incremental backup for multiple tables<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    tables = Lists.newArrayList(table1, table2);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.243"></a>
+<span class="sourceLineNo">226</span>  @Test<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  public void TestIncBackupMergeRestore() throws Exception {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    int ADD_ROWS = 99;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    // #1 - create full backup for all tables<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    LOG.info("create full backup image for all tables");<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1, table2);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    // Set custom Merge Job implementation<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    conf1.setClass(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS,<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      BackupMergeJobWithFailures.class, BackupMergeJob.class);<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    String backupIdFull = client.backupTables(request);<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.245"></a>
+<span class="sourceLineNo">245</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>    t1 = insertIntoTable(conn, table1, famName, 2, ADD_ROWS);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    t1.close();<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>    t2 = insertIntoTable(conn, table2, famName, 2, ADD_ROWS);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    t2.close();<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>    // #3 - incremental backup for multiple tables<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    String backupIdIncMultiple2 = client.backupTables(request);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    assertTrue(checkSucceeded(backupIdIncMultiple2));<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        // #4 Merge backup images with failures<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    for (FailurePhase phase : FailurePhase.values()) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      Configuration conf = conn.getConfiguration();<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>      conf.set(FAILURE_PHASE_KEY, phase.toString());<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>      try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        bAdmin.mergeBackups(backups);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        Assert.fail("Expected IOException");<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      } catch (IOException e) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        BackupSystemTable table = new BackupSystemTable(conn);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        if(phase.ordinal() &lt; FailurePhase.PHASE4.ordinal()) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          // No need to repair:<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          // Both Merge and backup exclusive operations are finished<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          assertFalse(table.isMergeInProgress());<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          try {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            table.finishBackupExclusiveOperation();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>            Assert.fail("IOException is expected");<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          } catch(IOException ee) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            // Expected<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        } else {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          // Repair is required<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          assertTrue(table.isMergeInProgress());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>            table.startBackupExclusiveOperation();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            Assert.fail("IOException is expected");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          } catch(IOException ee) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            // Expected - clean up before proceeding<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            table.finishMergeOperation();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            table.finishBackupExclusiveOperation();<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        table.close();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        LOG.debug("Expected :"+ e.getMessage());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    // Now merge w/o failures<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    Configuration conf = conn.getConfiguration();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    conf.unset(FAILURE_PHASE_KEY);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    conf.unset(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>    try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      bAdmin.mergeBackups(backups);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // #6 - restore incremental backup for multiple tables, with overwrite<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1, table2 };<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    TableName[] tablesMapIncMultiple = new TableName[] { table1_restore, table2_restore };<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple2, false,<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      tablesRestoreIncMultiple, tablesMapIncMultiple, true));<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>    Table hTable = conn.getTable(table1_restore);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    LOG.debug("After incremental restore: " + hTable.getTableDescriptor());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    LOG.debug("f1 has " + TEST_UTIL.countRows(hTable, famName) + " rows");<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable, famName), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>    hTable.close();<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    hTable = conn.getTable(table2_restore);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    hTable.close();<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>    admin.close();<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    conn.close();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>}<a name="line.326"></a>
+<span class="sourceLineNo">247</span>    // #2 - insert some data to table1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    HTable t1 = insertIntoTable(conn, table1, famName, 1, ADD_ROWS);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    LOG.debug("writing " + ADD_ROWS + " rows to " + table1);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    t1.close();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table1);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    HTable t2 = insertIntoTable(conn, table2, famName, 1, ADD_ROWS);<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    Assert.assertEquals(TEST_UTIL.countRows(t2), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    t2.close();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table2);<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // #3 - incremental backup for multiple tables<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    tables = Lists.newArrayList(table1, table2);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    t1 = insertIntoTable(conn, table1, famName, 2, ADD_ROWS);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    t1.close();<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>    t2 = insertIntoTable(conn, table2, famName, 2, ADD_ROWS);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    t2.close();<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    // #3 - incremental backup for multiple tables<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    String backupIdIncMultiple2 = client.backupTables(request);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    assertTrue(checkSucceeded(backupIdIncMultiple2));<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        // #4 Merge backup images with failures<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    for (FailurePhase phase : FailurePhase.values()) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Configuration conf = conn.getConfiguration();<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>      conf.set(FAILURE_PHASE_KEY, phase.toString());<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>      try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        bAdmin.mergeBackups(backups);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        Assert.fail("Expected IOException");<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      } catch (IOException e) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        BackupSystemTable table = new BackupSystemTable(conn);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        if(phase.ordinal() &lt; FailurePhase.PHASE4.ordinal()) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          // No need to repair:<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          // Both Merge and backup exclusive operations are finished<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          assertFalse(table.isMergeInProgress());<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            table.finishBackupExclusiveOperation();<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            Assert.fail("IOException is expected");<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          } catch(IOException ee) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            // Expected<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        } else {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          // Repair is required<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          assertTrue(table.isMergeInProgress());<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          try {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>            table.startBackupExclusiveOperation();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            Assert.fail("IOException is expected");<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          } catch(IOException ee) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>            // Expected - clean up before proceeding<a name="line.308"></a>
+<span class="sourceLineNo">309</span>            //table.finishMergeOperation();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>            //table.finishBackupExclusiveOperation();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          }<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        table.close();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        LOG.debug("Expected :"+ e.getMessage());<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    // Now merge w/o failures<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    Configuration conf = conn.getConfiguration();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    conf.unset(FAILURE_PHASE_KEY);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    conf.unset(BackupRestoreFactory.HBASE_BACKUP_MERGE_IMPL_CLASS);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    // Now run repair<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    BackupSystemTable sysTable = new BackupSystemTable(conn);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    BackupCommands.RepairCommand.repairFailedBackupMergeIfAny(conn, sysTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    // Now repeat merge<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      bAdmin.mergeBackups(backups);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    // #6 - restore incremental backup for multiple tables, with overwrite<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1, table2 };<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    TableName[] tablesMapIncMultiple = new TableName[] { table1_restore, table2_restore };<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple2, false,<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      tablesRestoreIncMultiple, tablesMapIncMultiple, true));<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Table hTable = conn.getTable(table1_restore);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    LOG.debug("After incremental restore: " + hTable.getTableDescriptor());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    LOG.debug("f1 has " + TEST_UTIL.countRows(hTable, famName) + " rows");<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable, famName), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>    hTable.close();<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>    hTable = conn.getTable(table2_restore);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    hTable.close();<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>    admin.close();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    conn.close();<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>}<a name="line.350"></a>
 
 
 


[06/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
index b834cdd..cc2f731 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
@@ -50,410 +50,408 @@
 <span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.RegionPlan;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer;<a name="line.43"></a>
 <span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.net.Address;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.util.ReflectionUtils;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.slf4j.Logger;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.slf4j.LoggerFactory;<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hbase.thirdparty.com.google.common.collect.ArrayListMultimap;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hbase.thirdparty.com.google.common.collect.LinkedListMultimap;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>/**<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * GroupBasedLoadBalancer, used when Region Server Grouping is configured (HBase-6721)<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * It does region balance based on a table's group membership.<a name="line.59"></a>
-<span class="sourceLineNo">060</span> *<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * Most assignment methods contain two exclusive code paths: Online - when the group<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * table is online and Offline - when it is unavailable.<a name="line.62"></a>
-<span class="sourceLineNo">063</span> *<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * During Offline, assignments are assigned based on cached information in zookeeper.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * If unavailable (ie bootstrap) then regions are assigned randomly.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Once the GROUP table has been assigned, the balancer switches to Online and will then<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * start providing appropriate assignments for user tables.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> *<a name="line.69"></a>
-<span class="sourceLineNo">070</span> */<a name="line.70"></a>
-<span class="sourceLineNo">071</span>@InterfaceAudience.Private<a name="line.71"></a>
-<span class="sourceLineNo">072</span>public class RSGroupBasedLoadBalancer implements RSGroupableBalancer {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private static final Logger LOG = LoggerFactory.getLogger(RSGroupBasedLoadBalancer.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private Configuration config;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private ClusterMetrics clusterStatus;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private MasterServices masterServices;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private volatile RSGroupInfoManager rsGroupInfoManager;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private LoadBalancer internalBalancer;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  /**<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   * Used by reflection in {@link org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory}.<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  @InterfaceAudience.Private<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public RSGroupBasedLoadBalancer() {}<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  @Override<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  public Configuration getConf() {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    return config;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  @Override<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  public void setConf(Configuration conf) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    this.config = conf;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Override<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void setClusterMetrics(ClusterMetrics sm) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    this.clusterStatus = sm;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @Override<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this.masterServices = masterServices;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public List&lt;RegionPlan&gt; balanceCluster(TableName tableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      clusterState) throws HBaseIOException {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    return balanceCluster(clusterState);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  @Override<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public List&lt;RegionPlan&gt; balanceCluster(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState)<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      throws HBaseIOException {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    if (!isOnline()) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      throw new ConstraintException(RSGroupInfoManager.RSGROUP_TABLE_NAME +<a name="line.117"></a>
-<span class="sourceLineNo">118</span>          " is not online, unable to perform balance");<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    }<a name="line.119"></a>
-<span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>    Map&lt;ServerName,List&lt;RegionInfo&gt;&gt; correctedState = correctAssignments(clusterState);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    List&lt;RegionPlan&gt; regionPlans = new ArrayList&lt;&gt;();<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>    List&lt;RegionInfo&gt; misplacedRegions = correctedState.get(LoadBalancer.BOGUS_SERVER_NAME);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    for (RegionInfo regionInfo : misplacedRegions) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      ServerName serverName = findServerForRegion(clusterState, regionInfo);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      regionPlans.add(new RegionPlan(regionInfo, serverName, null));<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    try {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      List&lt;RSGroupInfo&gt; rsgi = rsGroupInfoManager.listRSGroups();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      for (RSGroupInfo info: rsgi) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; groupClusterState = new HashMap&lt;&gt;();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; groupClusterLoad = new HashMap&lt;&gt;();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        for (Address sName : info.getServers()) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          for(ServerName curr: clusterState.keySet()) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            if(curr.getAddress().equals(sName)) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>              groupClusterState.put(curr, correctedState.get(curr));<a name="line.137"></a>
-<span class="sourceLineNo">138</span>            }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        }<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        groupClusterLoad.put(HConstants.ENSEMBLE_TABLE_NAME, groupClusterState);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        this.internalBalancer.setClusterLoad(groupClusterLoad);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        List&lt;RegionPlan&gt; groupPlans = this.internalBalancer<a name="line.143"></a>
-<span class="sourceLineNo">144</span>            .balanceCluster(groupClusterState);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        if (groupPlans != null) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          regionPlans.addAll(groupPlans);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    } catch (IOException exp) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      LOG.warn("Exception while balancing cluster.", exp);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      regionPlans.clear();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return regionPlans;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.util.ReflectionUtils;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.slf4j.Logger;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.slf4j.LoggerFactory;<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hbase.thirdparty.com.google.common.collect.ArrayListMultimap;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hbase.thirdparty.com.google.common.collect.LinkedListMultimap;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>/**<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * GroupBasedLoadBalancer, used when Region Server Grouping is configured (HBase-6721)<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * It does region balance based on a table's group membership.<a name="line.60"></a>
+<span class="sourceLineNo">061</span> *<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * Most assignment methods contain two exclusive code paths: Online - when the group<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * table is online and Offline - when it is unavailable.<a name="line.63"></a>
+<span class="sourceLineNo">064</span> *<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * During Offline, assignments are assigned based on cached information in zookeeper.<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * If unavailable (ie bootstrap) then regions are assigned randomly.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> *<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Once the GROUP table has been assigned, the balancer switches to Online and will then<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * start providing appropriate assignments for user tables.<a name="line.69"></a>
+<span class="sourceLineNo">070</span> *<a name="line.70"></a>
+<span class="sourceLineNo">071</span> */<a name="line.71"></a>
+<span class="sourceLineNo">072</span>@InterfaceAudience.Private<a name="line.72"></a>
+<span class="sourceLineNo">073</span>public class RSGroupBasedLoadBalancer implements RSGroupableBalancer {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static final Logger LOG = LoggerFactory.getLogger(RSGroupBasedLoadBalancer.class);<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private Configuration config;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private ClusterMetrics clusterStatus;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private MasterServices masterServices;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private volatile RSGroupInfoManager rsGroupInfoManager;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private LoadBalancer internalBalancer;<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  /**<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * Used by reflection in {@link org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory}.<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  @InterfaceAudience.Private<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  public RSGroupBasedLoadBalancer() {}<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  @Override<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  public Configuration getConf() {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    return config;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  }<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @Override<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public void setConf(Configuration conf) {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    this.config = conf;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Override<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public void setClusterMetrics(ClusterMetrics sm) {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    this.clusterStatus = sm;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  @Override<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  public void setMasterServices(MasterServices masterServices) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    this.masterServices = masterServices;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  public List&lt;RegionPlan&gt; balanceCluster(TableName tableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      clusterState) throws HBaseIOException {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    return balanceCluster(clusterState);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @Override<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public List&lt;RegionPlan&gt; balanceCluster(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; clusterState)<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      throws HBaseIOException {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    if (!isOnline()) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      throw new ConstraintException(RSGroupInfoManager.RSGROUP_TABLE_NAME +<a name="line.118"></a>
+<span class="sourceLineNo">119</span>          " is not online, unable to perform balance");<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    }<a name="line.120"></a>
+<span class="sourceLineNo">121</span><a name="line.121"></a>
+<span class="sourceLineNo">122</span>    // Calculate correct assignments and a list of RegionPlan for mis-placed regions<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    Pair&lt;Map&lt;ServerName,List&lt;RegionInfo&gt;&gt;, List&lt;RegionPlan&gt;&gt; correctedStateAndRegionPlans =<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        correctAssignments(clusterState);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    Map&lt;ServerName,List&lt;RegionInfo&gt;&gt; correctedState = correctedStateAndRegionPlans.getFirst();<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    List&lt;RegionPlan&gt; regionPlans = correctedStateAndRegionPlans.getSecond();<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // Add RegionPlan<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    // for the regions which have been placed according to the region server group assignment<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    // into the movement list<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    try {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      List&lt;RSGroupInfo&gt; rsgi = rsGroupInfoManager.listRSGroups();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      for (RSGroupInfo info: rsgi) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; groupClusterState = new HashMap&lt;&gt;();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; groupClusterLoad = new HashMap&lt;&gt;();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        for (Address sName : info.getServers()) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>          for(ServerName curr: clusterState.keySet()) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>            if(curr.getAddress().equals(sName)) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>              groupClusterState.put(curr, correctedState.get(curr));<a name="line.139"></a>
+<span class="sourceLineNo">140</span>            }<a name="line.140"></a>
+<span class="sourceLineNo">141</span>          }<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        groupClusterLoad.put(HConstants.ENSEMBLE_TABLE_NAME, groupClusterState);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        this.internalBalancer.setClusterLoad(groupClusterLoad);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        List&lt;RegionPlan&gt; groupPlans = this.internalBalancer<a name="line.145"></a>
+<span class="sourceLineNo">146</span>            .balanceCluster(groupClusterState);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        if (groupPlans != null) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          regionPlans.addAll(groupPlans);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    } catch (IOException exp) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      LOG.warn("Exception while balancing cluster.", exp);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      regionPlans.clear();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
 <span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      List&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = Maps.newHashMap();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    ListMultimap&lt;String,RegionInfo&gt; regionMap = ArrayListMultimap.create();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    ListMultimap&lt;String,ServerName&gt; serverMap = ArrayListMultimap.create();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    generateGroupMaps(regions, servers, regionMap, serverMap);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    for(String groupKey : regionMap.keySet()) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      if (regionMap.get(groupKey).size() &gt; 0) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result =<a name="line.165"></a>
-<span class="sourceLineNo">166</span>            this.internalBalancer.roundRobinAssignment(<a name="line.166"></a>
-<span class="sourceLineNo">167</span>                regionMap.get(groupKey),<a name="line.167"></a>
-<span class="sourceLineNo">168</span>                serverMap.get(groupKey));<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        if(result != null) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          if(result.containsKey(LoadBalancer.BOGUS_SERVER_NAME) &amp;&amp;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>              assignments.containsKey(LoadBalancer.BOGUS_SERVER_NAME)){<a name="line.171"></a>
-<span class="sourceLineNo">172</span>            assignments.get(LoadBalancer.BOGUS_SERVER_NAME).addAll(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>              result.get(LoadBalancer.BOGUS_SERVER_NAME));<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          } else {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            assignments.putAll(result);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          }<a name="line.176"></a>
-<span class="sourceLineNo">177</span>        }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    return assignments;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  @Override<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      Map&lt;RegionInfo, ServerName&gt; regions, List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    try {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      ListMultimap&lt;String, RegionInfo&gt; groupToRegion = ArrayListMultimap.create();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      Set&lt;RegionInfo&gt; misplacedRegions = getMisplacedRegions(regions);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      for (RegionInfo region : regions.keySet()) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        if (!misplacedRegions.contains(region)) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>          String groupName = rsGroupInfoManager.getRSGroupOfTable(region.getTable());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>          groupToRegion.put(groupName, region);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      // Now the "groupToRegion" map has only the regions which have correct<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      // assignments.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      for (String key : groupToRegion.keySet()) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        Map&lt;RegionInfo, ServerName&gt; currentAssignmentMap = new TreeMap&lt;RegionInfo, ServerName&gt;();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        List&lt;RegionInfo&gt; regionList = groupToRegion.get(key);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        RSGroupInfo info = rsGroupInfoManager.getRSGroup(key);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        List&lt;ServerName&gt; candidateList = filterOfflineServers(info, servers);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        for (RegionInfo region : regionList) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          currentAssignmentMap.put(region, regions.get(region));<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        if(candidateList.size() &gt; 0) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          assignments.putAll(this.internalBalancer.retainAssignment(<a name="line.207"></a>
-<span class="sourceLineNo">208</span>              currentAssignmentMap, candidateList));<a name="line.208"></a>
+<span class="sourceLineNo">156</span>    // Return the whole movement list<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    return regionPlans;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  @Override<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; roundRobinAssignment(<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      List&lt;RegionInfo&gt; regions, List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = Maps.newHashMap();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    ListMultimap&lt;String,RegionInfo&gt; regionMap = ArrayListMultimap.create();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    ListMultimap&lt;String,ServerName&gt; serverMap = ArrayListMultimap.create();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    generateGroupMaps(regions, servers, regionMap, serverMap);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    for(String groupKey : regionMap.keySet()) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      if (regionMap.get(groupKey).size() &gt; 0) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result =<a name="line.169"></a>
+<span class="sourceLineNo">170</span>            this.internalBalancer.roundRobinAssignment(<a name="line.170"></a>
+<span class="sourceLineNo">171</span>                regionMap.get(groupKey),<a name="line.171"></a>
+<span class="sourceLineNo">172</span>                serverMap.get(groupKey));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        if(result != null) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          if(result.containsKey(LoadBalancer.BOGUS_SERVER_NAME) &amp;&amp;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>              assignments.containsKey(LoadBalancer.BOGUS_SERVER_NAME)){<a name="line.175"></a>
+<span class="sourceLineNo">176</span>            assignments.get(LoadBalancer.BOGUS_SERVER_NAME).addAll(<a name="line.176"></a>
+<span class="sourceLineNo">177</span>              result.get(LoadBalancer.BOGUS_SERVER_NAME));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>          } else {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>            assignments.putAll(result);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>          }<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        }<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    return assignments;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>  @Override<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; retainAssignment(<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      Map&lt;RegionInfo, ServerName&gt; regions, List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    try {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments = new TreeMap&lt;&gt;();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      ListMultimap&lt;String, RegionInfo&gt; groupToRegion = ArrayListMultimap.create();<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      Set&lt;RegionInfo&gt; misplacedRegions = getMisplacedRegions(regions);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      for (RegionInfo region : regions.keySet()) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        if (!misplacedRegions.contains(region)) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>          String groupName = rsGroupInfoManager.getRSGroupOfTable(region.getTable());<a name="line.196"></a>
+<span class="sourceLineNo">197</span>          groupToRegion.put(groupName, region);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      // Now the "groupToRegion" map has only the regions which have correct<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      // assignments.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      for (String key : groupToRegion.keySet()) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        Map&lt;RegionInfo, ServerName&gt; currentAssignmentMap = new TreeMap&lt;RegionInfo, ServerName&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        List&lt;RegionInfo&gt; regionList = groupToRegion.get(key);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        RSGroupInfo info = rsGroupInfoManager.getRSGroup(key);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        List&lt;ServerName&gt; candidateList = filterOfflineServers(info, servers);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        for (RegionInfo region : regionList) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          currentAssignmentMap.put(region, regions.get(region));<a name="line.208"></a>
 <span class="sourceLineNo">209</span>        }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>      for (RegionInfo region : misplacedRegions) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        String groupName = rsGroupInfoManager.getRSGroupOfTable(region.getTable());<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        RSGroupInfo info = rsGroupInfoManager.getRSGroup(groupName);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        List&lt;ServerName&gt; candidateList = filterOfflineServers(info, servers);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        ServerName server = this.internalBalancer.randomAssignment(region,<a name="line.216"></a>
-<span class="sourceLineNo">217</span>            candidateList);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        if (server != null) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          if (!assignments.containsKey(server)) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>            assignments.put(server, new ArrayList&lt;&gt;());<a name="line.220"></a>
-<span class="sourceLineNo">221</span>          }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>          assignments.get(server).add(region);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        } else {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>          //if not server is available assign to bogus so it ends up in RIT<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          if(!assignments.containsKey(LoadBalancer.BOGUS_SERVER_NAME)) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>            assignments.put(LoadBalancer.BOGUS_SERVER_NAME, new ArrayList&lt;&gt;());<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          assignments.get(LoadBalancer.BOGUS_SERVER_NAME).add(region);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return assignments;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    } catch (IOException e) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      throw new HBaseIOException("Failed to do online retain assignment", e);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  @Override<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  public ServerName randomAssignment(RegionInfo region,<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    ListMultimap&lt;String,RegionInfo&gt; regionMap = LinkedListMultimap.create();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    ListMultimap&lt;String,ServerName&gt; serverMap = LinkedListMultimap.create();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    generateGroupMaps(Lists.newArrayList(region), servers, regionMap, serverMap);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    List&lt;ServerName&gt; filteredServers = serverMap.get(regionMap.keySet().iterator().next());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return this.internalBalancer.randomAssignment(region, filteredServers);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  private void generateGroupMaps(<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    List&lt;RegionInfo&gt; regions,<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    List&lt;ServerName&gt; servers,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    ListMultimap&lt;String, RegionInfo&gt; regionMap,<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    ListMultimap&lt;String, ServerName&gt; serverMap) throws HBaseIOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    try {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      for (RegionInfo region : regions) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        String groupName = rsGroupInfoManager.getRSGroupOfTable(region.getTable());<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        if (groupName == null) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          LOG.warn("Group for table "+region.getTable()+" is null");<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        regionMap.put(groupName, region);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      for (String groupKey : regionMap.keySet()) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        RSGroupInfo info = rsGroupInfoManager.getRSGroup(groupKey);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        serverMap.putAll(groupKey, filterOfflineServers(info, servers));<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        if(serverMap.get(groupKey).size() &lt; 1) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          serverMap.put(groupKey, LoadBalancer.BOGUS_SERVER_NAME);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    } catch(IOException e) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      throw new HBaseIOException("Failed to generate group maps", e);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  private List&lt;ServerName&gt; filterOfflineServers(RSGroupInfo RSGroupInfo,<a name="line.272"></a>
-<span class="sourceLineNo">273</span>                                                List&lt;ServerName&gt; onlineServers) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (RSGroupInfo != null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      return filterServers(RSGroupInfo.getServers(), onlineServers);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      LOG.warn("RSGroup Information found to be null. Some regions might be unassigned.");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      return Collections.EMPTY_LIST;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Filter servers based on the online servers.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   *<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * @param servers<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   *          the servers<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @param onlineServers<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   *          List of servers which are online.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * @return the list<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  private List&lt;ServerName&gt; filterServers(Set&lt;Address&gt; servers,<a name="line.291"></a>
-<span class="sourceLineNo">292</span>                                         List&lt;ServerName&gt; onlineServers) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    /**<a name="line.293"></a>
-<span class="sourceLineNo">294</span>     * servers is actually a TreeSet (see {@link org.apache.hadoop.hbase.rsgroup.RSGroupInfo}),<a name="line.294"></a>
-<span class="sourceLineNo">295</span>     * having its contains()'s time complexity as O(logn), which is good enough.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>     * TODO: consider using HashSet to pursue O(1) for contains() throughout the calling chain<a name="line.296"></a>
-<span class="sourceLineNo">297</span>     * if needed. */<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    ArrayList&lt;ServerName&gt; finalList = new ArrayList&lt;&gt;();<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    for (ServerName onlineServer : onlineServers) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      if (servers.contains(onlineServer.getAddress())) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        finalList.add(onlineServer);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>    return finalList;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  @VisibleForTesting<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  public Set&lt;RegionInfo&gt; getMisplacedRegions(<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Map&lt;RegionInfo, ServerName&gt; regions) throws IOException {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    Set&lt;RegionInfo&gt; misplacedRegions = new HashSet&lt;&gt;();<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    for(Map.Entry&lt;RegionInfo, ServerName&gt; region : regions.entrySet()) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      RegionInfo regionInfo = region.getKey();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      ServerName assignedServer = region.getValue();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      RSGroupInfo info = rsGroupInfoManager.getRSGroup(rsGroupInfoManager.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>              getRSGroupOfTable(regionInfo.getTable()));<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      if (assignedServer == null) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        LOG.debug("There is no assigned server for {}", region);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        continue;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      }<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RSGroupInfo otherInfo = rsGroupInfoManager.getRSGroupOfServer(assignedServer.getAddress());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      if (info == null &amp;&amp; otherInfo == null) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        LOG.warn("Couldn't obtain rs group information for {} on {}", region, assignedServer);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        continue;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      if ((info == null || !info.containsServer(assignedServer.getAddress()))) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        LOG.debug("Found misplaced region: " + regionInfo.getRegionNameAsString() +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            " on server: " + assignedServer +<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            " found in group: " +  otherInfo +<a name="line.329"></a>
-<span class="sourceLineNo">330</span>            " outside of group: " + (info == null ? "UNKNOWN" : info.getName()));<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        misplacedRegions.add(regionInfo);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return misplacedRegions;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  private ServerName findServerForRegion(<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; existingAssignments, RegionInfo region) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry : existingAssignments.entrySet()) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      if (entry.getValue().contains(region)) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        return entry.getKey();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    throw new IllegalStateException("Could not find server for region "<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        + region.getShortNameToLog());<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  private Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; correctAssignments(<a name="line.349"></a>
-<span class="sourceLineNo">350</span>       Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; existingAssignments)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  throws HBaseIOException{<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; correctAssignments = new TreeMap&lt;&gt;();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    correctAssignments.put(LoadBalancer.BOGUS_SERVER_NAME, new LinkedList&lt;&gt;());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments : existingAssignments.entrySet()){<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      ServerName sName = assignments.getKey();<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      correctAssignments.put(sName, new LinkedList&lt;&gt;());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      List&lt;RegionInfo&gt; regions = assignments.getValue();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      for (RegionInfo region : regions) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        RSGroupInfo info = null;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        try {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          info = rsGroupInfoManager.getRSGroup(<a name="line.361"></a>
-<span class="sourceLineNo">362</span>              rsGroupInfoManager.getRSGroupOfTable(region.getTable()));<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        } catch (IOException exp) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          LOG.debug("RSGroup information null for region of table " + region.getTable(),<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              exp);<a name="line.365"></a>
+<span class="sourceLineNo">210</span>        if(candidateList.size() &gt; 0) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>          assignments.putAll(this.internalBalancer.retainAssignment(<a name="line.211"></a>
+<span class="sourceLineNo">212</span>              currentAssignmentMap, candidateList));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>      for (RegionInfo region : misplacedRegions) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        String groupName = rsGroupInfoManager.getRSGroupOfTable(region.getTable());<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        RSGroupInfo info = rsGroupInfoManager.getRSGroup(groupName);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        List&lt;ServerName&gt; candidateList = filterOfflineServers(info, servers);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        ServerName server = this.internalBalancer.randomAssignment(region,<a name="line.220"></a>
+<span class="sourceLineNo">221</span>            candidateList);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        if (server != null) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>          if (!assignments.containsKey(server)) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>            assignments.put(server, new ArrayList&lt;&gt;());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>          assignments.get(server).add(region);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          //if not server is available assign to bogus so it ends up in RIT<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          if(!assignments.containsKey(LoadBalancer.BOGUS_SERVER_NAME)) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            assignments.put(LoadBalancer.BOGUS_SERVER_NAME, new ArrayList&lt;&gt;());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          assignments.get(LoadBalancer.BOGUS_SERVER_NAME).add(region);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      return assignments;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    } catch (IOException e) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new HBaseIOException("Failed to do online retain assignment", e);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  @Override<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  public ServerName randomAssignment(RegionInfo region,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      List&lt;ServerName&gt; servers) throws HBaseIOException {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    ListMultimap&lt;String,RegionInfo&gt; regionMap = LinkedListMultimap.create();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    ListMultimap&lt;String,ServerName&gt; serverMap = LinkedListMultimap.create();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    generateGroupMaps(Lists.newArrayList(region), servers, regionMap, serverMap);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    List&lt;ServerName&gt; filteredServers = serverMap.get(regionMap.keySet().iterator().next());<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    return this.internalBalancer.randomAssignment(region, filteredServers);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  private void generateGroupMaps(<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    List&lt;RegionInfo&gt; regions,<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    List&lt;ServerName&gt; servers,<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    ListMultimap&lt;String, RegionInfo&gt; regionMap,<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    ListMultimap&lt;String, ServerName&gt; serverMap) throws HBaseIOException {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    try {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      for (RegionInfo region : regions) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        String groupName = rsGroupInfoManager.getRSGroupOfTable(region.getTable());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        if (groupName == null) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>          LOG.warn("Group for table "+region.getTable()+" is null");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        regionMap.put(groupName, region);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      for (String groupKey : regionMap.keySet()) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        RSGroupInfo info = rsGroupInfoManager.getRSGroup(groupKey);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        serverMap.putAll(groupKey, filterOfflineServers(info, servers));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        if(serverMap.get(groupKey).size() &lt; 1) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>          serverMap.put(groupKey, LoadBalancer.BOGUS_SERVER_NAME);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      }<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    } catch(IOException e) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      throw new HBaseIOException("Failed to generate group maps", e);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private List&lt;ServerName&gt; filterOfflineServers(RSGroupInfo RSGroupInfo,<a name="line.276"></a>
+<span class="sourceLineNo">277</span>                                                List&lt;ServerName&gt; onlineServers) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (RSGroupInfo != null) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return filterServers(RSGroupInfo.getServers(), onlineServers);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } else {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.warn("RSGroup Information found to be null. Some regions might be unassigned.");<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      return Collections.EMPTY_LIST;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<a name="line.284"></a>
+<span class="sourceLineNo">285</span><a name="line.285"></a>
+<span class="sourceLineNo">286</span>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Filter servers based on the online servers.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   *<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @param servers<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   *          the servers<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * @param onlineServers<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   *          List of servers which are online.<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * @return the list<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private List&lt;ServerName&gt; filterServers(Set&lt;Address&gt; servers,<a name="line.295"></a>
+<span class="sourceLineNo">296</span>                                         List&lt;ServerName&gt; onlineServers) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    /**<a name="line.297"></a>
+<span class="sourceLineNo">298</span>     * servers is actually a TreeSet (see {@link org.apache.hadoop.hbase.rsgroup.RSGroupInfo}),<a name="line.298"></a>
+<span class="sourceLineNo">299</span>     * having its contains()'s time complexity as O(logn), which is good enough.<a name="line.299"></a>
+<span class="sourceLineNo">300</span>     * TODO: consider using HashSet to pursue O(1) for contains() throughout the calling chain<a name="line.300"></a>
+<span class="sourceLineNo">301</span>     * if needed. */<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    ArrayList&lt;ServerName&gt; finalList = new ArrayList&lt;&gt;();<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    for (ServerName onlineServer : onlineServers) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      if (servers.contains(onlineServer.getAddress())) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        finalList.add(onlineServer);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    return finalList;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  @VisibleForTesting<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public Set&lt;RegionInfo&gt; getMisplacedRegions(<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      Map&lt;RegionInfo, ServerName&gt; regions) throws IOException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    Set&lt;RegionInfo&gt; misplacedRegions = new HashSet&lt;&gt;();<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    for(Map.Entry&lt;RegionInfo, ServerName&gt; region : regions.entrySet()) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      RegionInfo regionInfo = region.getKey();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      ServerName assignedServer = region.getValue();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      RSGroupInfo info = rsGroupInfoManager.getRSGroup(rsGroupInfoManager.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>              getRSGroupOfTable(regionInfo.getTable()));<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (assignedServer == null) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        LOG.debug("There is no assigned server for {}", region);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        continue;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      RSGroupInfo otherInfo = rsGroupInfoManager.getRSGroupOfServer(assignedServer.getAddress());<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      if (info == null &amp;&amp; otherInfo == null) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        LOG.warn("Couldn't obtain rs group information for {} on {}", region, assignedServer);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        continue;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if ((info == null || !info.containsServer(assignedServer.getAddress()))) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        LOG.debug("Found misplaced region: " + regionInfo.getRegionNameAsString() +<a name="line.331"></a>
+<span class="sourceLineNo">332</span>            " on server: " + assignedServer +<a name="line.332"></a>
+<span class="sourceLineNo">333</span>            " found in group: " +  otherInfo +<a name="line.333"></a>
+<span class="sourceLineNo">334</span>            " outside of group: " + (info == null ? "UNKNOWN" : info.getName()));<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        misplacedRegions.add(regionInfo);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    return misplacedRegions;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  private Pair&lt;Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;, List&lt;RegionPlan&gt;&gt; correctAssignments(<a name="line.341"></a>
+<span class="sourceLineNo">342</span>       Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; existingAssignments)<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  throws HBaseIOException{<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    // To return<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; correctAssignments = new TreeMap&lt;&gt;();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    List&lt;RegionPlan&gt; regionPlansForMisplacedRegions = new ArrayList&lt;&gt;();<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; assignments : existingAssignments.entrySet()){<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      ServerName currentHostServer = assignments.getKey();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      correctAssignments.put(currentHostServer, new LinkedList&lt;&gt;());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      List&lt;RegionInfo&gt; regions = assignments.getValue();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      for (RegionInfo region : regions) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        RSGroupInfo targetRSGInfo = null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          targetRSGInfo = rsGroupInfoManager.getRSGroup(<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              rsGroupInfoManager.getRSGroupOfTable(region.getTable()));<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        } catch (IOException exp) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>          LOG.debug("RSGroup information null for region of table " + region.getTable(),<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              exp);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        if (targetRSGInfo == null ||<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            !targetRSGInfo.containsServer(currentHostServer.getAddress())) { // region is mis-placed<a name="line.362"></a>
+<span class="sourceLineNo">363</span>          regionPlansForMisplacedRegions.add(new RegionPlan(region, currentHostServer, null));<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        } else { // region is placed as expected<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          correctAssignments.get(currentHostServer).add(region);<a name="line.365"></a>
 <span class="sourceLineNo">366</span>        }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        if ((info == null) || (!info.containsServer(sName.getAddress()))) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>          correctAssignments.get(LoadBalancer.BOGUS_SERVER_NAME).add(region);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        } else {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          correctAssignments.get(sName).add(region);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    return correctAssignments;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Override<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public void initialize() throws HBaseIOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    try {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      if (rsGroupInfoManager == null) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        List&lt;RSGroupAdminEndpoint&gt; cps =<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          masterServices.getMasterCoprocessorHost().findCoprocessors(RSGroupAdminEndpoint.class);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        if (cps.size() != 1) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          String msg = "Expected one implementation of GroupAdminEndpoint but found " + cps.size();<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          LOG.error(msg);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          throw new HBaseIOException(msg);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        rsGroupInfoManager = cps.get(0).getGroupInfoManager();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        if(rsGroupInfoManager == null){<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          String msg = "RSGroupInfoManager hasn't been initialized";<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          LOG.error(msg);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          throw new HBaseIOException(msg);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        rsGroupInfoManager.start();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    } catch (IOException e) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      throw new HBaseIOException("Failed to initialize GroupInfoManagerImpl", e);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    // Create the balancer<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    Class&lt;? extends LoadBalancer&gt; balancerKlass = config.getClass(HBASE_RSGROUP_LOADBALANCER_CLASS,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        StochasticLoadBalancer.class, LoadBalancer.class);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    internalBalancer = ReflectionUtils.newInstance(balancerKlass, config);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    internalBalancer.setMasterServices(masterServices);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    internalBalancer.setClusterMetrics(clusterStatus);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    internalBalancer.setConf(config);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    internalBalancer.initialize();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public boolean isOnline() {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    if (this.rsGroupInfoManager == null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      return false;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    return this.rsGroupInfoManager.isOnline();<a name="line.415"></a>
-<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>  @Override<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  @Override<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>  @Override<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  public void onConfigurationChange(Configuration conf) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    //DO nothing for now<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  @Override<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  public void stop(String why) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  @Override<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  public boolean isStopped() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return false;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @VisibleForTesting<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void setRsGroupInfoManager(RSGroupInfoManager rsGroupInfoManager) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.rsGroupInfoManager = rsGroupInfoManager;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>}<a name="line.448"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>    // Return correct assignments and region movement plan for mis-placed regions together<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return new Pair&lt;Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;, List&lt;RegionPlan&gt;&gt;(<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        correctAssignments, regionPlansForMisplacedRegions);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>  @Override<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  public void initialize() throws HBaseIOException {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    try {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      if (rsGroupInfoManager == null) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        List&lt;RSGroupAdminEndpoint&gt; cps =<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          masterServices.getMasterCoprocessorHost().findCoprocessors(RSGroupAdminEndpoint.class);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        if (cps.size() != 1) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          String msg = "Expected one implementation of GroupAdminEndpoint but found " + cps.size();<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          LOG.error(msg);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          throw new HBaseIOException(msg);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        rsGroupInfoManager = cps.get(0).getGroupInfoManager();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        if(rsGroupInfoManager == null){<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          String msg = "RSGroupInfoManager hasn't been initialized";<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          LOG.error(msg);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          throw new HBaseIOException(msg);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        rsGroupInfoManager.start();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    } catch (IOException e) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      throw new HBaseIOException("Failed to initialize GroupInfoManagerImpl", e);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // Create the balancer<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    Class&lt;? extends LoadBalancer&gt; balancerKlass = config.getClass(HBASE_RSGROUP_LOADBALANCER_CLASS,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        StochasticLoadBalancer.class, LoadBalancer.class);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    internalBalancer = ReflectionUtils.newInstance(balancerKlass, config);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    internalBalancer.setMasterServices(masterServices);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    internalBalancer.setClusterMetrics(clusterStatus);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    internalBalancer.setConf(config);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    internalBalancer.initialize();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>  public boolean isOnline() {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    if (this.rsGroupInfoManager == null) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      return false;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>    return this.rsGroupInfoManager.isOnline();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  public void setClusterLoad(Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; clusterLoad) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>  @Override<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  public void regionOnline(RegionInfo regionInfo, ServerName sn) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
+<span class="sourceLineNo">423</span><a name="line.423"></a>
+<span class="sourceLineNo">424</span>  @Override<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public void regionOffline(RegionInfo regionInfo) {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  public void onConfigurationChange(Configuration conf) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    //DO nothing for now<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>  @Override<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public void stop(String why) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>  @Override<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public boolean isStopped() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return false;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>  @VisibleForTesting<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public void setRsGroupInfoManager(RSGroupInfoManager rsGroupInfoManager) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    this.rsGroupInfoManager = rsGroupInfoManager;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span>}<a name="line.446"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 9b114ff..cf2dce7 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -324,7 +324,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 5506488..8aa3913 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -426,7 +426,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index e8aaa4a..dea0511 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -284,7 +284,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index a153037..568708d 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -281,7 +281,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index f7e3dd0..4a96507 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -484,7 +484,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 2d8c987..7444989 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -334,7 +334,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 


[04/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupMerge.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupMerge.html b/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupMerge.html
new file mode 100644
index 0000000..c2e901d
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/class-use/TestBackupMerge.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.backup.TestBackupMerge (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.backup.TestBackupMerge (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/backup/class-use/TestBackupMerge.html" target="_top">Frames</a></li>
+<li><a href="TestBackupMerge.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.backup.TestBackupMerge" class="title">Uses of Class<br>org.apache.hadoop.hbase.backup.TestBackupMerge</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.backup.TestBackupMerge</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/backup/class-use/TestBackupMerge.html" target="_top">Frames</a></li>
+<li><a href="TestBackupMerge.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-frame.html
index 76ce284..2e9bb7b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-frame.html
@@ -24,6 +24,7 @@
 <li><a href="TestBackupDeleteWithFailures.MasterSnapshotObserver.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupDeleteWithFailures.MasterSnapshotObserver</a></li>
 <li><a href="TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupDescribe</a></li>
 <li><a href="TestBackupHFileCleaner.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupHFileCleaner</a></li>
+<li><a href="TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupMerge</a></li>
 <li><a href="TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupMultipleDeletes</a></li>
 <li><a href="TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupRepair</a></li>
 <li><a href="TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup" target="classFrame">TestBackupShowHistory</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-summary.html
index 125a5d5..be7efb8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-summary.html
@@ -131,105 +131,109 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMerge</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup">TestBackupMultipleDeletes</a></td>
 <td class="colLast">
 <div class="block">Create multiple backups for two tables: table1, table2 then perform 1 delete</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup">TestBackupRepair</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup">TestBackupShowHistory</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupSmallTests.html" title="class in org.apache.hadoop.hbase.backup">TestBackupSmallTests</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupStatusProgress.html" title="class in org.apache.hadoop.hbase.backup">TestBackupStatusProgress</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup">TestBackupSystemTable</a></td>
 <td class="colLast">
 <div class="block">Test cases for backup system table API</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackup.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackup</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupSet.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupSet</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupSetRestoreSet.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupSetRestoreSet</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestFullBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestFullBackupWithFailures</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestFullRestore.html" title="class in org.apache.hadoop.hbase.backup">TestFullRestore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestHFileArchiving.html" title="class in org.apache.hadoop.hbase.backup">TestHFileArchiving</a></td>
 <td class="colLast">
 <div class="block">Test that the <code>HFileArchiver</code> correctly removes all the parts of a region when cleaning up
  a region</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackup.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackup</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupDeleteTable.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupDeleteTable</a></td>
 <td class="colLast">
 <div class="block">1.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithBulkLoad</a></td>
 <td class="colLast">
 <div class="block">1.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithFailures</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestRemoteBackup.html" title="class in org.apache.hadoop.hbase.backup">TestRemoteBackup</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestRemoteRestore.html" title="class in org.apache.hadoop.hbase.backup">TestRemoteRestore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestRepairAfterFailedDelete.html" title="class in org.apache.hadoop.hbase.backup">TestRepairAfterFailedDelete</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestRestoreBoundaryTests.html" title="class in org.apache.hadoop.hbase.backup">TestRestoreBoundaryTests</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/backup/TestSystemTableSnapshot.html" title="class in org.apache.hadoop.hbase.backup">TestSystemTableSnapshot</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index d422ab3..f31348f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -107,6 +107,7 @@
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteRestore.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteRestore</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDescribe</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupMerge</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupMultipleDeletes</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupRepair</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupShowHistory</span></a></li>
@@ -143,8 +144,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
index 15ca1d7..570df8a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -847,18 +847,22 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestBackupShowHistory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupShowHistory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestBackupMerge.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupMerge.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestBackupCommandLineTool.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupCommandLineTool.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestBackupShowHistory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupShowHistory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestFullRestore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestFullRestore.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestBackupCommandLineTool.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupCommandLineTool.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestFullRestore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestFullRestore.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestBackupSmallTests.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupSmallTests.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 4837d80..ec56445 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index cc127ba..27fc263 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -576,13 +576,13 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index ca2f47e..b72e392 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -205,8 +205,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 558ff8e..18520c7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -652,11 +652,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index ab7cd54..9327c6e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,10 +253,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index 9db3dde..3aaa45a 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -2249,6 +2249,7 @@
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupDescribe.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDescribe</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.master.<a href="org/apache/hadoop/hbase/backup/master/TestBackupLogCleaner.html" title="class in org.apache.hadoop.hbase.backup.master"><span class="typeNameLink">TestBackupLogCleaner</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupMerge.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupMerge</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupMultipleDeletes.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupMultipleDeletes</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupRepair.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupRepair</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupShowHistory.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupShowHistory</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html
new file mode 100644
index 0000000..04cf3ad
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestBackupMerge.html
@@ -0,0 +1,204 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> *<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.backup;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import static org.junit.Assert.assertTrue;<a name="line.20"></a>
+<span class="sourceLineNo">021</span><a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
+<span class="sourceLineNo">023</span><a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.TableName;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.backup.impl.BackupAdminImpl;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.client.Table;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.junit.Assert;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.junit.ClassRule;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.junit.Test;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.junit.experimental.categories.Category;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.slf4j.Logger;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.slf4j.LoggerFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>@Category(LargeTests.class)<a name="line.42"></a>
+<span class="sourceLineNo">043</span>public class TestBackupMerge extends TestBackupBase {<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>  @ClassRule<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.46"></a>
+<span class="sourceLineNo">047</span>      HBaseClassTestRule.forClass(TestBackupMerge.class);<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>  private static final Logger LOG =<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      LoggerFactory.getLogger(TestBackupMerge.class);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  @Test<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  public void TestIncBackupMergeRestore() throws Exception {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    int ADD_ROWS = 99;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    // #1 - create full backup for all tables<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    LOG.info("create full backup image for all tables");<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1, table2);<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    // Set custom Merge Job implementation<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    String backupIdFull = client.backupTables(request);<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>    // #2 - insert some data to table1<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    HTable t1 = insertIntoTable(conn, table1, famName, 1, ADD_ROWS);<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    LOG.debug("writing " + ADD_ROWS + " rows to " + table1);<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    t1.close();<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table1);<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>    HTable t2 = insertIntoTable(conn, table2, famName, 1, ADD_ROWS);<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>    Assert.assertEquals(TEST_UTIL.countRows(t2), NB_ROWS_IN_BATCH + ADD_ROWS);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    t2.close();<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    LOG.debug("written " + ADD_ROWS + " rows to " + table2);<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    // #3 - incremental backup for multiple tables<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    tables = Lists.newArrayList(table1, table2);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>    t1 = insertIntoTable(conn, table1, famName, 2, ADD_ROWS);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    t1.close();<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>    t2 = insertIntoTable(conn, table2, famName, 2, ADD_ROWS);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    t2.close();<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>    // #3 - incremental backup for multiple tables<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    String backupIdIncMultiple2 = client.backupTables(request);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    assertTrue(checkSucceeded(backupIdIncMultiple2));<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>    try (BackupAdmin bAdmin = new BackupAdminImpl(conn)) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      String[] backups = new String[] { backupIdIncMultiple, backupIdIncMultiple2 };<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      bAdmin.mergeBackups(backups);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>    // #6 - restore incremental backup for multiple tables, with overwrite<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1, table2 };<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    TableName[] tablesMapIncMultiple = new TableName[] { table1_restore, table2_restore };<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple2, false,<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      tablesRestoreIncMultiple, tablesMapIncMultiple, true));<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>    Table hTable = conn.getTable(table1_restore);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    LOG.debug("After incremental restore: " + hTable.getTableDescriptor());<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    int countRows = TEST_UTIL.countRows(hTable, famName);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    LOG.debug("f1 has " + countRows + " rows");<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    Assert.assertEquals(NB_ROWS_IN_BATCH + 2 * ADD_ROWS, countRows);<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>    hTable.close();<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>    hTable = conn.getTable(table2_restore);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH + 2 * ADD_ROWS);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    hTable.close();<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>    admin.close();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    conn.close();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>}<a name="line.132"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>


[20/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index b3e04b3..0d5531b 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -228,12 +228,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index bb8d237..b854f00 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -704,20 +704,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index 2731576..3bd22b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -131,8 +131,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index 13e9410..0315949 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -199,8 +199,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 034077c..c20ff47 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
index fbb3edc..e25fb5b 100644
--- a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.72">RSGroupBasedLoadBalancer</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.73">RSGroupBasedLoadBalancer</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBalancer.html" title="interface in org.apache.hadoop.hbase.rsgroup">RSGroupableBalancer</a></pre>
 <div class="block">GroupBasedLoadBalancer, used when Region Server Grouping is configured (HBase-6721)
@@ -232,7 +232,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 </td>
 </tr>
 <tr id="i2" class="altColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
+<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&gt;</code></
 td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#correctAssignments-java.util.Map-">correctAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)</code>&nbsp;</td>
 </tr>
 <tr id="i3" class="rowColor">
@@ -248,107 +248,102 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 </td>
 </tr>
 <tr id="i5" class="rowColor">
-<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#findServerForRegion-java.util.Map-org.apache.hadoop.hbase.client.RegionInfo-">findServerForRegion</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments,
-                   <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
-</tr>
-<tr id="i6" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#generateGroupMaps-java.util.List-java.util.List-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap-">generateGroupMaps</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionMap,
                  org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverMap)</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#getConf--">getConf</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#getMisplacedRegions-java.util.Map-">getMisplacedRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#initialize--">initialize</a></span>()</code>
 <div class="block">Initialize the load balancer.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#isOnline--">isOnline</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#isStopped--">isStopped</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">onConfigurationChange</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Get a random region server from the list</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">regionOffline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Marks the region as offline at balancer.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">regionOnline</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>
 <div class="block">Marks the region as online at balancer.</div>
 </td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">retainAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">roundRobinAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Perform a Round Robin assignment of regions.</div>
 </td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setClusterLoad-java.util.Map-">setClusterLoad</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&g
 t;&gt;&gt;&nbsp;clusterLoad)</code>
 <div class="block">Pass RegionStates and allow balancer to set the current cluster load.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">setClusterMetrics</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;sm)</code>
 <div class="block">Set the current cluster status.</div>
 </td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">setMasterServices</a></span>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</code>
 <div class="block">Set the master service.</div>
 </td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#setRsGroupInfoManager-org.apache.hadoop.hbase.rsgroup.RSGroupInfoManager-">setRsGroupInfoManager</a></span>(<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfoManager.html" title="interface in org.apache.hadoop.hbase.rsgroup">RSGroupInfoManager</a>&nbsp;rsGroupInfoManager)</code>&nbsp;</td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#stop-java.lang.String-">stop</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</code>
 <div class="block">Stop this service.</div>
@@ -389,7 +384,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.73">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.74">LOG</a></pre>
 </li>
 </ul>
 <a name="config">
@@ -398,7 +393,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 <ul class="blockList">
 <li class="blockList">
 <h4>config</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.75">config</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.76">config</a></pre>
 </li>
 </ul>
 <a name="clusterStatus">
@@ -407,7 +402,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterStatus</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.76">clusterStatus</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.77">clusterStatus</a></pre>
 </li>
 </ul>
 <a name="masterServices">
@@ -416,7 +411,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 <ul class="blockList">
 <li class="blockList">
 <h4>masterServices</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.77">masterServices</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.78">masterServices</a></pre>
 </li>
 </ul>
 <a name="rsGroupInfoManager">
@@ -425,7 +420,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 <ul class="blockList">
 <li class="blockList">
 <h4>rsGroupInfoManager</h4>
-<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfoManager.html" title="interface in org.apache.hadoop.hbase.rsgroup">RSGroupInfoManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.78">rsGroupInfoManager</a></pre>
+<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfoManager.html" title="interface in org.apache.hadoop.hbase.rsgroup">RSGroupInfoManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.79">rsGroupInfoManager</a></pre>
 </li>
 </ul>
 <a name="internalBalancer">
@@ -434,7 +429,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>internalBalancer</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.79">internalBalancer</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.80">internalBalancer</a></pre>
 </li>
 </ul>
 </li>
@@ -452,7 +447,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupableBa
 <li class="blockList">
 <h4>RSGroupBasedLoadBalancer</h4>
 <pre>@InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.85">RSGroupBasedLoadBalancer</a>()</pre>
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.86">RSGroupBasedLoadBalancer</a>()</pre>
 <div class="block">Used by reflection in <a href="../../../../../org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.html" title="class in org.apache.hadoop.hbase.master.balancer"><code>LoadBalancerFactory</code></a>.</div>
 </li>
 </ul>
@@ -470,7 +465,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.88">getConf</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.89">getConf</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -483,7 +478,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>setConf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.93">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.94">setConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>setConf</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -496,7 +491,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterMetrics</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.98">setClusterMetrics</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;sm)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.99">setClusterMetrics</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;sm)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterMetrics-org.apache.hadoop.hbase.ClusterMetrics-">LoadBalancer</a></code></span></div>
 <div class="block">Set the current cluster status.  This allows a LoadBalancer to map host name to a server</div>
 <dl>
@@ -511,7 +506,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>setMasterServices</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.103">setMasterServices</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.104">setMasterServices</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices-org.apache.hadoop.hbase.master.MasterServices-">LoadBalancer</a></code></span></div>
 <div class="block">Set the master service.</div>
 <dl>
@@ -526,7 +521,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceCluster</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.108">balanceCluster</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.109">balanceCluster</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;clusterState)
                                 throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#balanceCluster-org.apache.hadoop.hbase.TableName-java.util.Map-">LoadBalancer</a></code></span></div>
@@ -547,7 +542,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceCluster</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.114">balanceCluster</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;clusterState)
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.115">balanceCluster</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;clusterState)
                                 throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#balanceCluster-java.util.Map-">LoadBalancer</a></code></span></div>
 <div class="block">Perform the major balance operation</div>
@@ -567,7 +562,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>roundRobinAssignment</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.157">roundRobinAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.161">roundRobinAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                                                              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                                                       throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment-java.util.List-java.util.List-">LoadBalancer</a></code></span></div>
@@ -588,7 +583,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>retainAssignment</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.184">retainAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../..
 /org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.188">retainAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../..
 /org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                                                   throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment-java.util.Map-java.util.List-">LoadBalancer</a></code></span></div>
@@ -609,7 +604,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.238">randomAssignment</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.242">randomAssignment</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                             throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">LoadBalancer</a></code></span></div>
@@ -632,7 +627,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>generateGroupMaps</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.247">generateGroupMaps</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.251">generateGroupMaps</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                                org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionMap,
                                org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverMap)
@@ -649,7 +644,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>filterOfflineServers</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.272">filterOfflineServers</a>(<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfo.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupInfo</a>&nbsp;RSGroupInfo,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.276">filterOfflineServers</a>(<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfo.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupInfo</a>&nbsp;RSGroupInfo,
                                               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;onlineServers)</pre>
 </li>
 </ul>
@@ -659,7 +654,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>filterServers</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.291">filterServers</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.295">filterServers</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;onlineServers)</pre>
 <div class="block">Filter servers based on the online servers.</div>
 <dl>
@@ -677,7 +672,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>getMisplacedRegions</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.309">getMisplacedRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions)
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.313">getMisplacedRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions)
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -685,24 +680,14 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 </dl>
 </li>
 </ul>
-<a name="findServerForRegion-java.util.Map-org.apache.hadoop.hbase.client.RegionInfo-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>findServerForRegion</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.337">findServerForRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments,
-                                       <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</pre>
-</li>
-</ul>
 <a name="correctAssignments-java.util.Map-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>correctAssignments</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.349">correctAssignments</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javas
 e/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)
-                                                     throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&gt;&nbsp;<a href="../../../..
 /../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.341">correctAssignments</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)
+                                                                            throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></code></dd>
@@ -715,7 +700,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>initialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.378">initialize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.376">initialize</a>()
                 throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#initialize--">LoadBalancer</a></code></span></div>
 <div class="block">Initialize the load balancer. Must be called after setters.</div>
@@ -733,7 +718,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>isOnline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.410">isOnline</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.408">isOnline</a>()</pre>
 </li>
 </ul>
 <a name="setClusterLoad-java.util.Map-">
@@ -742,7 +727,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterLoad</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.419">setClusterLoad</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nbsp;clusterLoad)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.417">setClusterLoad</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nbsp;clusterLoad)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterLoad-java.util.Map-">LoadBalancer</a></code></span></div>
 <div class="block">Pass RegionStates and allow balancer to set the current cluster load.</div>
 <dl>
@@ -757,7 +742,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOnline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.423">regionOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.421">regionOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                          <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">LoadBalancer</a></code></span></div>
 <div class="block">Marks the region as online at balancer.</div>
@@ -773,7 +758,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOffline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.427">regionOffline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.425">regionOffline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline-org.apache.hadoop.hbase.client.RegionInfo-">LoadBalancer</a></code></span></div>
 <div class="block">Marks the region as offline at balancer.</div>
 <dl>
@@ -788,7 +773,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.431">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.429">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">ConfigurationObserver</a></code></span></div>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
@@ -806,7 +791,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.436">stop</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.434">stop</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Stoppable.html#stop-java.lang.String-">Stoppable</a></code></span></div>
 <div class="block">Stop this service.
  Implementers should favor logging errors over throwing RuntimeExceptions.</div>
@@ -824,7 +809,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopped</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.440">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.438">isStopped</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/Stoppable.html#isStopped--">isStopped</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a></code></dd>
@@ -839,7 +824,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setRsGroupInfoManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.445">setRsGroupInfoManager</a>(<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfoManager.html" title="interface in org.apache.hadoop.hbase.rsgroup">RSGroupInfoManager</a>&nbsp;rsGroupInfoManager)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.443">setRsGroupInfoManager</a>(<a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfoManager.html" title="interface in org.apache.hadoop.hbase.rsgroup">RSGroupInfoManager</a>&nbsp;rsGroupInfoManager)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index d02c856..5a7e325 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -138,8 +138,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 6ef281d..dfa02b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -191,9 +191,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 8e41b8e..41c2191 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -198,9 +198,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 </ul>
 </li>
 </ul>


[22/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html
index cece58b..0ebd51b 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html
@@ -18,8 +18,8 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10};
-var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var methods = {"i0":9,"i1":10,"i2":10,"i3":10,"i4":9};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
 var tableTab = "tableTab";
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.589">BackupCommands.RepairCommand</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.589">BackupCommands.RepairCommand</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></pre>
 </li>
 </ul>
@@ -175,26 +175,32 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 </a>
 <h3>Method Summary</h3>
 <table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
-<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
+<td class="colFirst"><code>private static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#checkRemoveBackupImages-org.apache.hadoop.fs.FileSystem-java.lang.String-java.lang.String:A-">checkRemoveBackupImages</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#execute--">execute</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i1" class="rowColor">
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#printUsage--">printUsage</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#repairFailedBackupDeletionIfAny-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.backup.impl.BackupSystemTable-">repairFailedBackupDeletionIfAny</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
                                <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;sysTable)</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
-<td class="colFirst"><code>private void</code></td>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#repairFailedBackupMergeIfAny-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.backup.impl.BackupSystemTable-">repairFailedBackupMergeIfAny</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
                             <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;sysTable)</code>&nbsp;</td>
 </tr>
@@ -289,9 +295,25 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>repairFailedBackupMergeIfAny</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#line.664">repairFailedBackupMergeIfAny</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
-                                          <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;sysTable)
-                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#line.664">repairFailedBackupMergeIfAny</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
+                                                <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;sysTable)
+                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="checkRemoveBackupImages-org.apache.hadoop.fs.FileSystem-java.lang.String-java.lang.String:A-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>checkRemoveBackupImages</h4>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#line.705">checkRemoveBackupImages</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
+                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)
+                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
@@ -304,7 +326,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#line.688">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#line.724">printUsage</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html#printUsage--">printUsage</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.html
index cd7aacf..cf87929 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.html
@@ -132,7 +132,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <th class="colLast" scope="col">Class and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.BackupSetCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
@@ -144,31 +144,31 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.CreateCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.CreateCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.DeleteCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.DescribeCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.HelpCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.HistoryCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.MergeCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.ProgressCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.RepairCommand</a></span></code>&nbsp;</td>
 </tr>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupCommands.Command.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupCommands.Command.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupCommands.Command.html
index dffced3..6620e96 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupCommands.Command.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupCommands.Command.html
@@ -103,7 +103,7 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.BackupSetCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
@@ -111,31 +111,31 @@
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.CreateCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.CreateCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.DeleteCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.DescribeCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.HelpCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.HistoryCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.MergeCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.ProgressCommand</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.RepairCommand</a></span></code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupSystemTable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupSystemTable.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupSystemTable.html
index 1a742fd..50087c5 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupSystemTable.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/class-use/BackupSystemTable.html
@@ -173,7 +173,7 @@
                                <a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;sysTable)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private void</code></td>
+<td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="typeNameLabel">BackupCommands.RepairCommand.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#repairFailedBackupMergeIfAny-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.backup.impl.BackupSystemTable-">repairFailedBackupMergeIfAny</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
                             <a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;sysTable)</code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html b/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html
index 169934b..c25fd3b 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -187,44 +187,56 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;pathList)</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected org.apache.hadoop.fs.Path</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#convertToDest-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">convertToDest</a></span>(org.apache.hadoop.fs.Path&nbsp;p,
+             org.apache.hadoop.fs.Path&nbsp;backupDirPath)</code>
+<div class="block">Converts path before copying</div>
+</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#copyFile-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">copyFile</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+        org.apache.hadoop.fs.Path&nbsp;p,
+        org.apache.hadoop.fs.Path&nbsp;newPath)</code>
+<div class="block">Copy file in DFS from p to newPath</div>
+</td>
+</tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#copyMetaData-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">copyMetaData</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+            org.apache.hadoop.fs.Path&nbsp;tmpBackupDir,
+            org.apache.hadoop.fs.Path&nbsp;backupDirPath)</code>
+<div class="block">Copy meta data to of a backup session</div>
+</td>
+</tr>
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#deleteBackupImages-java.util.List-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.fs.FileSystem-java.lang.String-">deleteBackupImages</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;backupIds,
                   <a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
                   org.apache.hadoop.fs.FileSystem&nbsp;fs,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot)</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
-<td class="colFirst"><code>private boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#deleteData-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">deleteData</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
-          org.apache.hadoop.fs.Path&nbsp;dest)</code>
-<div class="block">Deletes only data files and keeps all META</div>
-</td>
-</tr>
-<tr id="i3" class="rowColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>protected org.apache.hadoop.fs.Path[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#findInputDirectories-org.apache.hadoop.fs.FileSystem-java.lang.String-org.apache.hadoop.hbase.TableName-java.lang.String:A-">findInputDirectories</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
                     <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
-<td class="colFirst"><code>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#findMostRecentBackupId-java.lang.String:A-">findMostRecentBackupId</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)</code>&nbsp;</td>
-</tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#getBackupIdsToDelete-java.lang.String:A-java.lang.String-">getBackupIdsToDelete</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;mergedBackupId)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#getConf--">getConf</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#getTableNamesInBackupImages-java.lang.String:A-">getTableNamesInBackupImages</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#moveData-org.apache.hadoop.fs.FileSystem-java.lang.String-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.TableName-java.lang.String-">moveData</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
@@ -232,25 +244,25 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
         <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;mergedBackupId)</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#run-java.lang.String:A-">run</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)</code>
 <div class="block">Run backup merge operation.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#setConf-org.apache.hadoop.conf.Configuration-">setConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#toPathList-java.util.List-">toPathList</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path&gt;&gt;&nbsp;processedTableList)</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#toTableNameList-java.util.List-">toTableNameList</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path&gt;&gt;&nbsp;processedTableList)</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#updateBackupManifest-java.lang.String-java.lang.String-java.util.List-">updateBackupManifest</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;mergedBackupId,
@@ -376,13 +388,73 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 </dl>
 </li>
 </ul>
+<a name="copyMetaData-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>copyMetaData</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.212">copyMetaData</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                            org.apache.hadoop.fs.Path&nbsp;tmpBackupDir,
+                            org.apache.hadoop.fs.Path&nbsp;backupDirPath)
+                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Copy meta data to of a backup session</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>fs</code> - file system</dd>
+<dd><code>tmpBackupDir</code> - temp backup directory, where meta is locaed</dd>
+<dd><code>backupDirPath</code> - new path for backup</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - exception</dd>
+</dl>
+</li>
+</ul>
+<a name="copyFile-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>copyFile</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.242">copyFile</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                        org.apache.hadoop.fs.Path&nbsp;p,
+                        org.apache.hadoop.fs.Path&nbsp;newPath)
+                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Copy file in DFS from p to newPath</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>fs</code> - file system</dd>
+<dd><code>p</code> - old path</dd>
+<dd><code>newPath</code> - new path</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - exception</dd>
+</dl>
+</li>
+</ul>
+<a name="convertToDest-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>convertToDest</h4>
+<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.259">convertToDest</a>(org.apache.hadoop.fs.Path&nbsp;p,
+                                                  org.apache.hadoop.fs.Path&nbsp;backupDirPath)</pre>
+<div class="block">Converts path before copying</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>p</code> - path</dd>
+<dd><code>backupDirPath</code> - backup root</dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>converted path</dd>
+</dl>
+</li>
+</ul>
 <a name="toPathList-java.util.List-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>toPathList</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.186">toPathList</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path&gt;&gt;&nbsp;processedTableList)</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.279">toPathList</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path&gt;&gt;&nbsp;processedTableList)</pre>
 </li>
 </ul>
 <a name="toTableNameList-java.util.List-">
@@ -391,7 +463,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 <ul class="blockList">
 <li class="blockList">
 <h4>toTableNameList</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.194">toTableNameList</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path&gt;&gt;&nbsp;processedTableList)</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.287">toTableNameList</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path&gt;&gt;&nbsp;processedTableList)</pre>
 </li>
 </ul>
 <a name="cleanupBulkLoadDirs-org.apache.hadoop.fs.FileSystem-java.util.List-">
@@ -400,7 +472,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupBulkLoadDirs</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.202">cleanupBulkLoadDirs</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.295">cleanupBulkLoadDirs</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;pathList)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -415,7 +487,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 <ul class="blockList">
 <li class="blockList">
 <h4>updateBackupManifest</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.210">updateBackupManifest</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.303">updateBackupManifest</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;mergedBackupId,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;backupsToDelete)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalArgumentException.html?is-external=true" title="class or interface in java.lang">IllegalArgumentException</a>,
@@ -433,7 +505,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteBackupImages</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.219">deleteBackupImages</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;backupIds,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.312">deleteBackupImages</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;backupIds,
                                   <a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
                                   org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot)
@@ -450,7 +522,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 <ul class="blockList">
 <li class="blockList">
 <h4>getBackupIdsToDelete</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.238">getBackupIdsToDelete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds,
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.331">getBackupIdsToDelete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds,
                                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;mergedBackupId)</pre>
 </li>
 </ul>
@@ -460,7 +532,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 <ul class="blockList">
 <li class="blockList">
 <h4>moveData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.249">moveData</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.342">moveData</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
                         org.apache.hadoop.fs.Path&nbsp;bulkOutputPath,
                         <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -474,45 +546,13 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 </dl>
 </li>
 </ul>
-<a name="deleteData-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>deleteData</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.282">deleteData</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
-                           org.apache.hadoop.fs.Path&nbsp;dest)
-                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a>,
-                           <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
-<div class="block">Deletes only data files and keeps all META</div>
-<dl>
-<dt><span class="paramLabel">Parameters:</span></dt>
-<dd><code>fs</code> - file system instance</dd>
-<dd><code>dest</code> - destination location</dd>
-<dt><span class="returnLabel">Returns:</span></dt>
-<dd>true, if success, false - otherwise</dd>
-<dt><span class="throwsLabel">Throws:</span></dt>
-<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a></code> - exception</dd>
-<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - exception</dd>
-</dl>
-</li>
-</ul>
-<a name="findMostRecentBackupId-java.lang.String:A-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>findMostRecentBackupId</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.307">findMostRecentBackupId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)</pre>
-</li>
-</ul>
 <a name="getTableNamesInBackupImages-java.lang.String:A-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableNamesInBackupImages</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.318">getTableNamesInBackupImages</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.365">getTableNamesInBackupImages</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -526,7 +566,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupMerge
 <ul class="blockListLast">
 <li class="blockList">
 <h4>findInputDirectories</h4>
-<pre>protected&nbsp;org.apache.hadoop.fs.Path[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.334">findInputDirectories</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>protected&nbsp;org.apache.hadoop.fs.Path[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.381">findInputDirectories</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
                                                            <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 5890b1a..90d5020 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -168,8 +168,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/util/BackupUtils.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/util/BackupUtils.html b/devapidocs/org/apache/hadoop/hbase/backup/util/BackupUtils.html
index e09bc0f..459dc8e 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/util/BackupUtils.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/util/BackupUtils.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9,"i24":9,"i25":9,"i26":9,"i27":9,"i28":9,"i29":9,"i30":9,"i31":9,"i32":9,"i33":9};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9,"i24":9,"i25":9,"i26":9,"i27":9,"i28":9,"i29":9,"i30":9,"i31":9,"i32":9,"i33":9,"i34":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -237,53 +237,57 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#failed-int-">failed</a></span>(int&nbsp;result)</code>&nbsp;</td>
 </tr>
 <tr id="i9" class="rowColor">
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#findMostRecentBackupId-java.lang.String:A-">findMostRecentBackupId</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)</code>&nbsp;</td>
+</tr>
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getBulkOutputDir-java.lang.String-org.apache.hadoop.conf.Configuration-">getBulkOutputDir</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
                 org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getBulkOutputDir-java.lang.String-org.apache.hadoop.conf.Configuration-boolean-">getBulkOutputDir</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
                 org.apache.hadoop.conf.Configuration&nbsp;conf,
                 boolean&nbsp;deleteOnExit)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getCreationTime-org.apache.hadoop.fs.Path-">getCreationTime</a></span>(org.apache.hadoop.fs.Path&nbsp;p)</code>
 <div class="block">Given the log file, parse the timestamp from the file name.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getFileNameCompatibleString-org.apache.hadoop.hbase.TableName-">getFileNameCompatibleString</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getFiles-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-java.util.List-org.apache.hadoop.fs.PathFilter-">getFiles</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
         org.apache.hadoop.fs.Path&nbsp;rootDir,
         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;files,
         org.apache.hadoop.fs.PathFilter&nbsp;filter)</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getFilesLength-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">getFilesLength</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
               org.apache.hadoop.fs.Path&nbsp;dir)</code>
 <div class="block">Get the total length of files under the given directory recursively.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/backup/BackupInfo.html" title="class in org.apache.hadoop.hbase.backup">BackupInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getHistory-org.apache.hadoop.conf.Configuration-int-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.backup.BackupInfo.Filter...-">getHistory</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
           int&nbsp;n,
           org.apache.hadoop.fs.Path&nbsp;backupRootPath,
           <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupInfo.Filter.html" title="interface in org.apache.hadoop.hbase.backup">BackupInfo.Filter</a>...&nbsp;filters)</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/backup/BackupInfo.html" title="class in org.apache.hadoop.hbase.backup">BackupInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getHistory-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.Path-">getHistory</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
           org.apache.hadoop.fs.Path&nbsp;backupRootPath)</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getLogBackupDir-java.lang.String-java.lang.String-">getLogBackupDir</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</code>
@@ -291,26 +295,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  backup.</div>
 </td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>static &lt;T&gt;&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getMinValue-java.util.HashMap-">getMinValue</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;T,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;map)</code>
 <div class="block">Get the min value for all the Values a map.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getPath-org.apache.hadoop.fs.Path-">getPath</a></span>(org.apache.hadoop.fs.Path&nbsp;p)</code>
 <div class="block">Return the 'path' component of a Path.</div>
 </td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getRSLogTimestampMins-java.util.HashMap-">getRSLogTimestampMins</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&gt;&nbsp;rsLogTimestampMap)</code>
 <div class="block">Loop through the RS log timestamp map for the tables, for each RS, find the min timestamp value
  for the RS among the tables.</div>
 </td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getTableBackupDir-java.lang.String-java.lang.String-org.apache.hadoop.hbase.TableName-">getTableBackupDir</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId,
@@ -319,26 +323,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  which is also where the backup manifest file is.</div>
 </td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getUniqueWALFileNamePart-org.apache.hadoop.fs.Path-">getUniqueWALFileNamePart</a></span>(org.apache.hadoop.fs.Path&nbsp;p)</code>
 <div class="block">Returns WAL file name</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getUniqueWALFileNamePart-java.lang.String-">getUniqueWALFileNamePart</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;walFileName)</code>
 <div class="block">Returns WAL file name</div>
 </td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#getWALFilesOlderThan-org.apache.hadoop.conf.Configuration-java.util.HashMap-">getWALFilesOlderThan</a></span>(org.apache.hadoop.conf.Configuration&nbsp;c,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;hostTimestampMap)</code>
 <div class="block">Get list of all old WAL files (WALs and archive)</div>
 </td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.FileStatus[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#listStatus-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.PathFilter-">listStatus</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
           org.apache.hadoop.fs.Path&nbsp;dir,
@@ -348,44 +352,44 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  return an empty FileStatus[] while Hadoop 2 will throw FileNotFoundException.</div>
 </td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupInfo.html" title="class in org.apache.hadoop.hbase.backup">BackupInfo</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#loadBackupInfo-org.apache.hadoop.fs.Path-java.lang.String-org.apache.hadoop.fs.FileSystem-">loadBackupInfo</a></span>(org.apache.hadoop.fs.Path&nbsp;backupRootPath,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId,
               org.apache.hadoop.fs.FileSystem&nbsp;fs)</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#parseHostFromOldLog-org.apache.hadoop.fs.Path-">parseHostFromOldLog</a></span>(org.apache.hadoop.fs.Path&nbsp;p)</code>
 <div class="block">Parses host name:port from archived WAL path</div>
 </td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#parseHostNameFromLogFile-org.apache.hadoop.fs.Path-">parseHostNameFromLogFile</a></span>(org.apache.hadoop.fs.Path&nbsp;p)</code>
 <div class="block">Parses hostname:port from WAL file path</div>
 </td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#parseTableNames-java.lang.String-">parseTableNames</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tables)</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/backup/BackupInfo.html" title="class in org.apache.hadoop.hbase.backup">BackupInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#sortHistoryListDesc-java.util.ArrayList-">sortHistoryListDesc</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/backup/BackupInfo.html" title="class in org.apache.hadoop.hbase.backup">BackupInfo</a>&gt;&nbsp;historyList)</code>
 <div class="block">Sort history list by start time in descending order.</div>
 </td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#succeeded-int-">succeeded</a></span>(int&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#validate-java.util.HashMap-org.apache.hadoop.conf.Configuration-">validate</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupManifest.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupManifest</a>&gt;&nbsp;backupManifestMap,
         org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/backup/util/BackupUtils.html#writeRegioninfoOnFilesystem-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.client.RegionInfo-">writeRegioninfoOnFilesystem</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                            org.apache.hadoop.fs.FileSystem&nbsp;fs,
@@ -1036,7 +1040,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="createLoader-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>createLoader</h4>
 <pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tool/LoadIncrementalHFiles.html" title="class in org.apache.hadoop.hbase.tool">LoadIncrementalHFiles</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/util/BackupUtils.html#line.723">createLoader</a>(org.apache.hadoop.conf.Configuration&nbsp;config)
@@ -1047,6 +1051,15 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="findMostRecentBackupId-java.lang.String:A-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>findMostRecentBackupId</h4>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/util/BackupUtils.html#line.744">findMostRecentBackupId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds)</pre>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html b/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html
index bdc486d..98a0db7 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html
@@ -1033,7 +1033,7 @@
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;clusterState)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
+<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&gt;</code></
 td>
 <td class="colLast"><span class="typeNameLabel">RSGroupBasedLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#correctAssignments-java.util.Map-">correctAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;existingAssignments)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">


[18/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
 
 
 


[07/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html
index 7e38fdd..18c30f4 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html
@@ -27,24 +27,24 @@
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.backup.util.BackupUtils.succeeded;<a name="line.20"></a>
 <span class="sourceLineNo">021</span><a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.io.FileNotFoundException;<a name="line.22"></a>
+<span class="sourceLineNo">022</span>import java.io.File;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import java.io.IOException;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import java.util.ArrayList;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.HashSet;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
 <span class="sourceLineNo">027</span>import java.util.Set;<a name="line.27"></a>
-<span class="sourceLineNo">028</span><a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.commons.lang3.StringUtils;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileStatus;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.FileSystem;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.fs.LocatedFileStatus;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.Path;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.RemoteIterator;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.TableName;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.backup.BackupInfo;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.backup.BackupMergeJob;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.39"></a>
+<span class="sourceLineNo">028</span>import java.util.Stack;<a name="line.28"></a>
+<span class="sourceLineNo">029</span><a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.commons.lang3.StringUtils;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.FileStatus;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.fs.FileSystem;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.LocatedFileStatus;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.Path;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.RemoteIterator;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.TableName;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.backup.BackupInfo;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.backup.BackupMergeJob;<a name="line.39"></a>
 <span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.40"></a>
 <span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.backup.impl.BackupManifest;<a name="line.41"></a>
 <span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.42"></a>
@@ -113,7 +113,7 @@
 <span class="sourceLineNo">105</span>      table.startMergeOperation(backupIds);<a name="line.105"></a>
 <span class="sourceLineNo">106</span><a name="line.106"></a>
 <span class="sourceLineNo">107</span>      // Select most recent backup id<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      String mergedBackupId = findMostRecentBackupId(backupIds);<a name="line.108"></a>
+<span class="sourceLineNo">108</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.108"></a>
 <span class="sourceLineNo">109</span><a name="line.109"></a>
 <span class="sourceLineNo">110</span>      TableName[] tableNames = getTableNamesInBackupImages(backupIds);<a name="line.110"></a>
 <span class="sourceLineNo">111</span><a name="line.111"></a>
@@ -154,210 +154,257 @@
 <span class="sourceLineNo">146</span>      table.updateProcessedTablesForMerge(tableList);<a name="line.146"></a>
 <span class="sourceLineNo">147</span>      finishedTables = true;<a name="line.147"></a>
 <span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>      // Move data<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      for (Pair&lt;TableName, Path&gt; tn : processedTableList) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        moveData(fs, backupRoot, tn.getSecond(), tn.getFirst(), mergedBackupId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>      // Delete old data and update manifest<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      List&lt;String&gt; backupsToDelete = getBackupIdsToDelete(backupIds, mergedBackupId);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      deleteBackupImages(backupsToDelete, conn, fs, backupRoot);<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      updateBackupManifest(backupRoot, mergedBackupId, backupsToDelete);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      // Finish merge session<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      table.finishMergeOperation();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      // Release lock<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      table.finishBackupExclusiveOperation();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    } catch (RuntimeException e) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>      throw e;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    } catch (Exception e) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      LOG.error(e.toString(), e);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      if (!finishedTables) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        // cleanup bulk directories and finish merge<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        // merge MUST be repeated (no need for repair)<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        cleanupBulkLoadDirs(fs, toPathList(processedTableList));<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        table.finishMergeOperation();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        table.finishBackupExclusiveOperation();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        throw new IOException("Backup merge operation failed, you should try it again", e);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      } else {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        // backup repair must be run<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        throw new IOException(<a name="line.176"></a>
-<span class="sourceLineNo">177</span>            "Backup merge operation failed, run backup repair tool to restore system's integrity",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>            e);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      }<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } finally {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      table.close();<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      conn.close();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>  protected List&lt;Path&gt; toPathList(List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    ArrayList&lt;Path&gt; list = new ArrayList&lt;&gt;();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    for (Pair&lt;TableName, Path&gt; p : processedTableList) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      list.add(p.getSecond());<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    return list;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected List&lt;TableName&gt; toTableNameList(List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ArrayList&lt;TableName&gt; list = new ArrayList&lt;&gt;();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    for (Pair&lt;TableName, Path&gt; p : processedTableList) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      list.add(p.getFirst());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    return list;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  protected void cleanupBulkLoadDirs(FileSystem fs, List&lt;Path&gt; pathList) throws IOException {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    for (Path path : pathList) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      if (!fs.delete(path, true)) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        LOG.warn("Can't delete " + path);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected void updateBackupManifest(String backupRoot, String mergedBackupId,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      List&lt;String&gt; backupsToDelete) throws IllegalArgumentException, IOException {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    BackupManifest manifest =<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        HBackupFileSystem.getManifest(conf, new Path(backupRoot), mergedBackupId);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    manifest.getBackupImage().removeAncestors(backupsToDelete);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // save back<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    manifest.store(conf);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  protected void deleteBackupImages(List&lt;String&gt; backupIds, Connection conn, FileSystem fs,<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      String backupRoot) throws IOException {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // Delete from backup system table<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    try (BackupSystemTable table = new BackupSystemTable(conn)) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      for (String backupId : backupIds) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        table.deleteBackupInfo(backupId);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      }<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    // Delete from file system<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    for (String backupId : backupIds) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      Path backupDirPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>      if (!fs.delete(backupDirPath, true)) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        LOG.warn("Could not delete " + backupDirPath);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  protected List&lt;String&gt; getBackupIdsToDelete(String[] backupIds, String mergedBackupId) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    List&lt;String&gt; list = new ArrayList&lt;&gt;();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    for (String id : backupIds) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      if (id.equals(mergedBackupId)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        continue;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      list.add(id);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return list;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  protected void moveData(FileSystem fs, String backupRoot, Path bulkOutputPath,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          TableName tableName, String mergedBackupId) throws IllegalArgumentException, IOException {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    Path dest =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        new Path(HBackupFileSystem.getTableBackupDir(backupRoot, mergedBackupId, tableName));<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>    // Delete all *data* files in dest<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    if (!deleteData(fs, dest)) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      throw new IOException("Could not delete " + dest);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    FileStatus[] fsts = fs.listStatus(bulkOutputPath);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for (FileStatus fst : fsts) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      if (fst.isDirectory()) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        String family =  fst.getPath().getName();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        Path newDst = new Path(dest, family);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        if (fs.exists(newDst)) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>          if (!fs.delete(newDst, true)) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>            throw new IOException("failed to delete :"+ newDst);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        fs.rename(fst.getPath(), dest);<a name="line.269"></a>
+<span class="sourceLineNo">149</span>      // PHASE 2 (modification of a backup file system)<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      // Move existing mergedBackupId data into tmp directory<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      // we will need it later in case of a failure<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      Path tmpBackupDir = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot,<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        mergedBackupId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      Path backupDirPath = HBackupFileSystem.getBackupPath(backupRoot, mergedBackupId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>      if (!fs.rename(backupDirPath, tmpBackupDir)) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        throw new IOException("Failed to rename "+ backupDirPath +" to "+tmpBackupDir);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      } else {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        LOG.debug("Renamed "+ backupDirPath +" to "+ tmpBackupDir);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      }<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      // Move new data into backup dest<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      for (Pair&lt;TableName, Path&gt; tn : processedTableList) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        moveData(fs, backupRoot, tn.getSecond(), tn.getFirst(), mergedBackupId);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      // Update backup manifest<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      List&lt;String&gt; backupsToDelete = getBackupIdsToDelete(backupIds, mergedBackupId);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      updateBackupManifest(tmpBackupDir.getParent().toString(), mergedBackupId, backupsToDelete);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      // Copy meta files back from tmp to backup dir<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      copyMetaData(fs, tmpBackupDir, backupDirPath);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      // Delete tmp dir (Rename back during repair)<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      if (!fs.delete(tmpBackupDir, true)) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        // WARN and ignore<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        LOG.warn("Could not delete tmp dir: "+ tmpBackupDir);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      // Delete old data<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      deleteBackupImages(backupsToDelete, conn, fs, backupRoot);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      // Finish merge session<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      table.finishMergeOperation();<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      // Release lock<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      table.finishBackupExclusiveOperation();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    } catch (RuntimeException e) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>      throw e;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    } catch (Exception e) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      LOG.error(e.toString(), e);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      if (!finishedTables) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        // cleanup bulk directories and finish merge<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        // merge MUST be repeated (no need for repair)<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        cleanupBulkLoadDirs(fs, toPathList(processedTableList));<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        table.finishMergeOperation();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        table.finishBackupExclusiveOperation();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        throw new IOException("Backup merge operation failed, you should try it again", e);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      } else {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        // backup repair must be run<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        throw new IOException(<a name="line.195"></a>
+<span class="sourceLineNo">196</span>            "Backup merge operation failed, run backup repair tool to restore system's integrity",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>            e);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    } finally {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      table.close();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      conn.close();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /**<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * Copy meta data to of a backup session<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * @param fs file system<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * @param tmpBackupDir temp backup directory, where meta is locaed<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param backupDirPath new path for backup<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * @throws IOException exception<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  protected void copyMetaData(FileSystem fs, Path tmpBackupDir, Path backupDirPath)<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      throws IOException {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    RemoteIterator&lt;LocatedFileStatus&gt; it = fs.listFiles(tmpBackupDir, true);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    List&lt;Path&gt; toKeep = new ArrayList&lt;Path&gt;();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    while (it.hasNext()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      Path p = it.next().getPath();<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      if (fs.isDirectory(p)) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>        continue;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      // Keep meta<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      String fileName = p.toString();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      if (fileName.indexOf(FSTableDescriptors.TABLEINFO_DIR) &gt; 0<a name="line.223"></a>
+<span class="sourceLineNo">224</span>          || fileName.indexOf(HRegionFileSystem.REGION_INFO_FILE) &gt; 0) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        toKeep.add(p);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    // Copy meta to destination<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    for (Path p : toKeep) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      Path newPath = convertToDest(p, backupDirPath);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      copyFile(fs, p, newPath);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * Copy file in DFS from p to newPath<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * @param fs file system<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param p old path<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param newPath new path<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * @throws IOException exception<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  protected void copyFile(FileSystem fs, Path p, Path newPath) throws IOException {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    File f = File.createTempFile("data", "meta");<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    Path localPath = new Path(f.getAbsolutePath());<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    fs.copyToLocalFile(p, localPath);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    fs.copyFromLocalFile(localPath, newPath);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    boolean exists = fs.exists(newPath);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    if (!exists) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      throw new IOException("Failed to copy meta file to: "+ newPath);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>/**<a name="line.253"></a>
+<span class="sourceLineNo">254</span> * Converts path before copying<a name="line.254"></a>
+<span class="sourceLineNo">255</span> * @param p path<a name="line.255"></a>
+<span class="sourceLineNo">256</span> * @param backupDirPath backup root<a name="line.256"></a>
+<span class="sourceLineNo">257</span> * @return converted path<a name="line.257"></a>
+<span class="sourceLineNo">258</span> */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  protected Path convertToDest(Path p, Path backupDirPath) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    String backupId = backupDirPath.getName();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    Stack&lt;String&gt; stack = new Stack&lt;String&gt;();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    String name = null;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    while (true) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      name = p.getName();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      if (!name.equals(backupId)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        stack.push(name);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        p = p.getParent();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      } else {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        break;<a name="line.269"></a>
 <span class="sourceLineNo">270</span>      }<a name="line.270"></a>
 <span class="sourceLineNo">271</span>    }<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  /**<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * Deletes only data files and keeps all META<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   * @param fs file system instance<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param dest destination location<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @return true, if success, false - otherwise<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @throws FileNotFoundException exception<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @throws IOException exception<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private boolean deleteData(FileSystem fs, Path dest) throws FileNotFoundException, IOException {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    RemoteIterator&lt;LocatedFileStatus&gt; it = fs.listFiles(dest, true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    List&lt;Path&gt; toDelete = new ArrayList&lt;Path&gt;();<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    while (it.hasNext()) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      Path p = it.next().getPath();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      if (fs.isDirectory(p)) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        continue;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      // Keep meta<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      String fileName  = p.toString();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      if (fileName.indexOf(FSTableDescriptors.TABLEINFO_DIR) &gt; 0 ||<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          fileName.indexOf(HRegionFileSystem.REGION_INFO_FILE) &gt; 0) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        continue;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      toDelete.add(p);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    for (Path p : toDelete) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      boolean result = fs.delete(p, false);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      if (!result) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        return false;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    return true;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  }<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>  protected String findMostRecentBackupId(String[] backupIds) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    long recentTimestamp = Long.MIN_VALUE;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    for (String backupId : backupIds) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      long ts = Long.parseLong(backupId.split("_")[1]);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      if (ts &gt; recentTimestamp) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        recentTimestamp = ts;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    return BackupRestoreConstants.BACKUPID_PREFIX + recentTimestamp;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  protected TableName[] getTableNamesInBackupImages(String[] backupIds) throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    Set&lt;TableName&gt; allSet = new HashSet&lt;&gt;();<a name="line.319"></a>
+<span class="sourceLineNo">272</span>    Path newPath = new Path(backupDirPath.toString());<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    while (!stack.isEmpty()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      newPath = new Path(newPath, stack.pop());<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return newPath;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  protected List&lt;Path&gt; toPathList(List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    ArrayList&lt;Path&gt; list = new ArrayList&lt;&gt;();<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    for (Pair&lt;TableName, Path&gt; p : processedTableList) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      list.add(p.getSecond());<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    return list;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  }<a name="line.285"></a>
+<span class="sourceLineNo">286</span><a name="line.286"></a>
+<span class="sourceLineNo">287</span>  protected List&lt;TableName&gt; toTableNameList(List&lt;Pair&lt;TableName, Path&gt;&gt; processedTableList) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    ArrayList&lt;TableName&gt; list = new ArrayList&lt;&gt;();<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    for (Pair&lt;TableName, Path&gt; p : processedTableList) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      list.add(p.getFirst());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    return list;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>  protected void cleanupBulkLoadDirs(FileSystem fs, List&lt;Path&gt; pathList) throws IOException {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    for (Path path : pathList) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      if (!fs.delete(path, true)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        LOG.warn("Can't delete " + path);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  protected void updateBackupManifest(String backupRoot, String mergedBackupId,<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      List&lt;String&gt; backupsToDelete) throws IllegalArgumentException, IOException {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    BackupManifest manifest =<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        HBackupFileSystem.getManifest(conf, new Path(backupRoot), mergedBackupId);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    manifest.getBackupImage().removeAncestors(backupsToDelete);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // save back<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    manifest.store(conf);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  protected void deleteBackupImages(List&lt;String&gt; backupIds, Connection conn, FileSystem fs,<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      String backupRoot) throws IOException {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // Delete from backup system table<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    try (BackupSystemTable table = new BackupSystemTable(conn)) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      for (String backupId : backupIds) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>        table.deleteBackupInfo(backupId);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
 <span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        BackupSystemTable table = new BackupSystemTable(conn)) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      for (String backupId : backupIds) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        BackupInfo bInfo = table.readBackupInfo(backupId);<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>        allSet.addAll(bInfo.getTableNames());<a name="line.326"></a>
+<span class="sourceLineNo">321</span>    // Delete from file system<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    for (String backupId : backupIds) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      Path backupDirPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>      if (!fs.delete(backupDirPath, true)) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        LOG.warn("Could not delete " + backupDirPath);<a name="line.326"></a>
 <span class="sourceLineNo">327</span>      }<a name="line.327"></a>
 <span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    TableName[] ret = new TableName[allSet.size()];<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return allSet.toArray(ret);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  protected Path[] findInputDirectories(FileSystem fs, String backupRoot, TableName tableName,<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      String[] backupIds) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    List&lt;Path&gt; dirs = new ArrayList&lt;&gt;();<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>    for (String backupId : backupIds) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      Path fileBackupDirPath =<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          new Path(HBackupFileSystem.getTableBackupDir(backupRoot, backupId, tableName));<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      if (fs.exists(fileBackupDirPath)) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        dirs.add(fileBackupDirPath);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      } else {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        if (LOG.isDebugEnabled()) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          LOG.debug("File: " + fileBackupDirPath + " does not exist.");<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      }<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    Path[] ret = new Path[dirs.size()];<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    return dirs.toArray(ret);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>}<a name="line.352"></a>
+<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  protected List&lt;String&gt; getBackupIdsToDelete(String[] backupIds, String mergedBackupId) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    List&lt;String&gt; list = new ArrayList&lt;&gt;();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    for (String id : backupIds) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      if (id.equals(mergedBackupId)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        continue;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      list.add(id);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return list;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>  protected void moveData(FileSystem fs, String backupRoot, Path bulkOutputPath,<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          TableName tableName, String mergedBackupId) throws IllegalArgumentException, IOException {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    Path dest =<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        new Path(HBackupFileSystem.getTableBackupDir(backupRoot, mergedBackupId, tableName));<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>    FileStatus[] fsts = fs.listStatus(bulkOutputPath);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    for (FileStatus fst : fsts) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      if (fst.isDirectory()) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        String family =  fst.getPath().getName();<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        Path newDst = new Path(dest, family);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        if (fs.exists(newDst)) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>          if (!fs.delete(newDst, true)) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>            throw new IOException("failed to delete :"+ newDst);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        } else {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          fs.mkdirs(dest);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        boolean result = fs.rename(fst.getPath(), dest);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        LOG.debug("MoveData from "+ fst.getPath() +" to "+ dest+" result="+ result);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  protected TableName[] getTableNamesInBackupImages(String[] backupIds) throws IOException {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    Set&lt;TableName&gt; allSet = new HashSet&lt;&gt;();<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        BackupSystemTable table = new BackupSystemTable(conn)) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      for (String backupId : backupIds) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        BackupInfo bInfo = table.readBackupInfo(backupId);<a name="line.371"></a>
+<span class="sourceLineNo">372</span><a name="line.372"></a>
+<span class="sourceLineNo">373</span>        allSet.addAll(bInfo.getTableNames());<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      }<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>    TableName[] ret = new TableName[allSet.size()];<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    return allSet.toArray(ret);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>  protected Path[] findInputDirectories(FileSystem fs, String backupRoot, TableName tableName,<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      String[] backupIds) throws IOException {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    List&lt;Path&gt; dirs = new ArrayList&lt;&gt;();<a name="line.383"></a>
+<span class="sourceLineNo">384</span><a name="line.384"></a>
+<span class="sourceLineNo">385</span>    for (String backupId : backupIds) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      Path fileBackupDirPath =<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          new Path(HBackupFileSystem.getTableBackupDir(backupRoot, backupId, tableName));<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      if (fs.exists(fileBackupDirPath)) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        dirs.add(fileBackupDirPath);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      } else {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        if (LOG.isDebugEnabled()) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          LOG.debug("File: " + fileBackupDirPath + " does not exist.");<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    Path[] ret = new Path[dirs.size()];<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    return dirs.toArray(ret);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>}<a name="line.399"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/util/BackupUtils.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/util/BackupUtils.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/util/BackupUtils.html
index c2de678..8dc15f2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/util/BackupUtils.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/util/BackupUtils.html
@@ -748,7 +748,19 @@
 <span class="sourceLineNo">740</span>    }<a name="line.740"></a>
 <span class="sourceLineNo">741</span>    return loader;<a name="line.741"></a>
 <span class="sourceLineNo">742</span>  }<a name="line.742"></a>
-<span class="sourceLineNo">743</span>}<a name="line.743"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public static String findMostRecentBackupId(String[] backupIds) {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    long recentTimestamp = Long.MIN_VALUE;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    for (String backupId : backupIds) {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      long ts = Long.parseLong(backupId.split("_")[1]);<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      if (ts &gt; recentTimestamp) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        recentTimestamp = ts;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    }<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    return BackupRestoreConstants.BACKUPID_PREFIX + recentTimestamp;<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>}<a name="line.755"></a>
 
 
 


[25/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
Published site at d5aaeee88b331e064830a2774f4fed238631457c.


Project: http://git-wip-us.apache.org/repos/asf/hbase-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase-site/commit/89e23f78
Tree: http://git-wip-us.apache.org/repos/asf/hbase-site/tree/89e23f78
Diff: http://git-wip-us.apache.org/repos/asf/hbase-site/diff/89e23f78

Branch: refs/heads/asf-site
Commit: 89e23f785c7cf789c39b9500a08041e10d82088b
Parents: 144e324
Author: jenkins <bu...@apache.org>
Authored: Sun Mar 11 14:53:41 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Sun Mar 11 14:53:41 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     6 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 40242 +++++++++--------
 checkstyle.rss                                  |    18 +-
 coc.html                                        |     4 +-
 cygwin.html                                     |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |    10 +-
 devapidocs/index-all.html                       |    32 +-
 .../hadoop/hbase/backup/HBackupFileSystem.html  |    77 +-
 .../hbase/backup/impl/BackupAdminImpl.html      |     2 +-
 .../impl/BackupCommands.BackupSetCommand.html   |    32 +-
 .../impl/BackupCommands.DeleteCommand.html      |     2 +-
 .../impl/BackupCommands.DescribeCommand.html    |     2 +-
 .../backup/impl/BackupCommands.HelpCommand.html |     2 +-
 .../impl/BackupCommands.HistoryCommand.html     |    18 +-
 .../impl/BackupCommands.MergeCommand.html       |    12 +-
 .../impl/BackupCommands.ProgressCommand.html    |     2 +-
 .../impl/BackupCommands.RepairCommand.html      |    46 +-
 .../hbase/backup/impl/BackupCommands.html       |    16 +-
 .../impl/class-use/BackupCommands.Command.html  |    16 +-
 .../impl/class-use/BackupSystemTable.html       |     2 +-
 .../mapreduce/MapReduceBackupMergeJob.html      |   166 +-
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../hadoop/hbase/backup/util/BackupUtils.html   |    65 +-
 .../hbase/class-use/HBaseIOException.html       |     2 +-
 .../hadoop/hbase/class-use/ServerName.html      |    32 +-
 .../hbase/client/class-use/Connection.html      |     2 +-
 .../hbase/client/class-use/RegionInfo.html      |    32 +-
 .../hadoop/hbase/client/package-tree.html       |    28 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     4 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     4 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     2 +-
 .../hbase/master/class-use/RegionPlan.html      |     4 +
 .../hadoop/hbase/master/package-tree.html       |     2 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    18 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../hadoop/hbase/regionserver/package-tree.html |    16 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hadoop/hbase/rest/model/package-tree.html   |     2 +-
 .../hbase/rsgroup/RSGroupBasedLoadBalancer.html |   117 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     4 +-
 .../hadoop/hbase/util/class-use/Pair.html       |    34 +-
 .../apache/hadoop/hbase/util/package-tree.html  |    10 +-
 .../apache/hadoop/hbase/util/package-use.html   |    41 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../hadoop/hbase/backup/HBackupFileSystem.html  |   171 +-
 .../hbase/backup/impl/BackupAdminImpl.html      |   195 +-
 .../impl/BackupCommands.BackupSetCommand.html   |   772 +-
 .../backup/impl/BackupCommands.Command.html     |   772 +-
 .../impl/BackupCommands.CreateCommand.html      |   772 +-
 .../impl/BackupCommands.DeleteCommand.html      |   772 +-
 .../impl/BackupCommands.DescribeCommand.html    |   772 +-
 .../backup/impl/BackupCommands.HelpCommand.html |   772 +-
 .../impl/BackupCommands.HistoryCommand.html     |   772 +-
 .../impl/BackupCommands.MergeCommand.html       |   772 +-
 .../impl/BackupCommands.ProgressCommand.html    |   772 +-
 .../impl/BackupCommands.RepairCommand.html      |   772 +-
 .../hbase/backup/impl/BackupCommands.html       |   772 +-
 .../mapreduce/MapReduceBackupMergeJob.html      |   473 +-
 .../hadoop/hbase/backup/util/BackupUtils.html   |    14 +-
 .../hbase/rsgroup/RSGroupBasedLoadBalancer.html |   800 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 testdevapidocs/allclasses-frame.html            |     1 +
 testdevapidocs/allclasses-noframe.html          |     1 +
 testdevapidocs/index-all.html                   |    10 +
 .../hadoop/hbase/backup/TestBackupBase.html     |     2 +-
 .../hbase/backup/TestBackupHFileCleaner.html    |     4 +-
 .../hadoop/hbase/backup/TestBackupMerge.html    |   360 +
 .../hbase/backup/TestBackupMultipleDeletes.html |     4 +-
 ...WithFailures.BackupMergeJobWithFailures.html |    14 +-
 ...talBackupMergeWithFailures.FailurePhase.html |    14 +-
 .../TestIncrementalBackupMergeWithFailures.html |    12 +-
 .../hbase/backup/class-use/TestBackupBase.html  |    42 +-
 .../hbase/backup/class-use/TestBackupMerge.html |   125 +
 .../hadoop/hbase/backup/package-frame.html      |     1 +
 .../hadoop/hbase/backup/package-summary.html    |    48 +-
 .../hadoop/hbase/backup/package-tree.html       |     3 +-
 .../hbase/class-use/HBaseClassTestRule.html     |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hadoop/hbase/regionserver/package-tree.html |     6 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 testdevapidocs/overview-tree.html               |     1 +
 .../hadoop/hbase/backup/TestBackupMerge.html    |   204 +
 ...WithFailures.BackupMergeJobWithFailures.html |   604 +-
 ...talBackupMergeWithFailures.FailurePhase.html |   604 +-
 .../TestIncrementalBackupMergeWithFailures.html |   604 +-
 121 files changed, 27780 insertions(+), 26335 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 62d116c..a29a04f 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -594,7 +594,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 708deb6..a0ba0e4 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180310144707+00'00')
-/CreationDate (D:20180310144707+00'00')
+/ModDate (D:20180311144708+00'00')
+/CreationDate (D:20180311144708+00'00')
 >>
 endobj
 2 0 obj
@@ -27896,7 +27896,7 @@ endobj
 endobj
 136 0 obj
 << /Limits [(__anchor-top) (adding.new.node)]
-/Names [(__anchor-top) 25 0 R (__indexterm-7407346) 3454 0 R (__indexterm-7409750) 3456 0 R (__indexterm-7411290) 3458 0 R (__indexterm-7413474) 3459 0 R (acid) 916 0 R (acl) 3275 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3557 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3559 0 R (add.metrics) 3555 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3797 0 R (adding.new.node) 3024 0 R]
+/Names [(__anchor-top) 25 0 R (__indexterm-7407344) 3454 0 R (__indexterm-7409748) 3456 0 R (__indexterm-7411288) 3458 0 R (__indexterm-7413472) 3459 0 R (acid) 916 0 R (acl) 3275 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3557 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3559 0 R (add.metrics) 3555 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 3797 0 R (adding.new.node) 3024 0 R]
 >>
 endobj
 137 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index f96a814..6f6b2c5 100644
--- a/book.html
+++ b/book.html
@@ -37286,7 +37286,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-03-10 14:30:17 UTC
+Last updated 2018-03-11 14:30:07 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index acd1693..9389c1e 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -299,7 +299,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 


[23/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 373d138..faf89c1 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,8 +25,8 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 3577,
-             Errors: 16169,
+      <title>File: 3578,
+             Errors: 16170,
              Warnings: 0,
              Infos: 0
       </title>
@@ -10056,6 +10056,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.backup.TestBackupMerge.java">org/apache/hadoop/hbase/backup/TestBackupMerge.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  1
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.zookeeper.MetricsZooKeeperSource.java">org/apache/hadoop/hbase/zookeeper/MetricsZooKeeperSource.java</a>
                 </td>
                 <td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 6a6174c..dcb60e4 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -368,7 +368,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/cygwin.html
----------------------------------------------------------------------
diff --git a/cygwin.html b/cygwin.html
index eb454f8..f6a9cbb 100644
--- a/cygwin.html
+++ b/cygwin.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Installing Apache HBase (TM) on Windows using Cygwin</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -667,7 +667,7 @@ Now your <b>HBase </b>server is running, <b>start coding</b> and build that next
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 0a13429..3b7e00f 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -433,7 +433,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index fa6f34f..8dfe335 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1063,7 +1063,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 53c7d7b..b179275 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -306,7 +306,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 1344ded..a416931 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180310" />
+    <meta name="Date-Revision-yyyymmdd" content="20180311" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -974,7 +974,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 27a5c9c..a5c5d34 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3740,21 +3740,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Sat Mar 10 14:41:51 UTC 2018"</code></td>
+<td class="colLast"><code>"Sun Mar 11 14:41:48 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"45bbee4905fb031259c935502444c729b32ddac8"</code></td>
+<td class="colLast"><code>"d5aaeee88b331e064830a2774f4fed238631457c"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"ab48fe70c3185997530bec793561bd68"</code></td>
+<td class="colLast"><code>"ab69d3995cfa81a49b4fd72d718151b5"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -4386,7 +4386,7 @@
 </li>
 <li class="blockList">
 <table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
-<caption><span>org.apache.hadoop.hbase.backup.impl.org.apache.hadoop.hbase.backup.impl.BackupCommands.BackupSetCommand</span><span class="tabEnd">&nbsp;</span></caption>
+<caption><span>org.apache.hadoop.hbase.backup.impl.<a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.BackupSetCommand</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th scope="col">Constant Field</th>
@@ -4433,7 +4433,7 @@
 </li>
 <li class="blockList">
 <table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
-<caption><span>org.apache.hadoop.hbase.backup.impl.org.apache.hadoop.hbase.backup.impl.BackupCommands.HistoryCommand</span><span class="tabEnd">&nbsp;</span></caption>
+<caption><span>org.apache.hadoop.hbase.backup.impl.<a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.HistoryCommand</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th scope="col">Constant Field</th>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 7b90126..fd1d0b9 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -10762,6 +10762,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#checkRegionsToMerge-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-boolean-">checkRegionsToMerge(RegionInfo, RegionInfo, boolean)</a></span> - Static method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MergeTableRegionsProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#checkRemoveBackupImages-org.apache.hadoop.fs.FileSystem-java.lang.String-java.lang.String:A-">checkRemoveBackupImages(FileSystem, String, String[])</a></span> - Static method in class org.apache.hadoop.hbase.backup.impl.<a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.RepairCommand</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/RegionInfoBuilder.MutableRegionInfo.html#checkReplicaId-int-">checkReplicaId(int)</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/RegionInfoBuilder.MutableRegionInfo.html" title="class in org.apache.hadoop.hbase.client">RegionInfoBuilder.MutableRegionInfo</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/HMaster.html#checkReplicationScope-org.apache.hadoop.hbase.client.ColumnFamilyDescriptor-">checkReplicationScope(ColumnFamilyDescriptor)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a></dt>
@@ -17355,6 +17357,10 @@
 <dd>
 <div class="block">Returns an array of bytes corresponding to an array of BigIntegers</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#convertToDest-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">convertToDest(Path, Path)</a></span> - Method in class org.apache.hadoop.hbase.backup.mapreduce.<a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html" title="class in org.apache.hadoop.hbase.backup.mapreduce">MapReduceBackupMergeJob</a></dt>
+<dd>
+<div class="block">Converts path before copying</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html#convertToProcedure-org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.Procedure-">convertToProcedure(ProcedureProtos.Procedure)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureUtil.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureUtil</a></dt>
 <dd>
 <div class="block">Helper to convert the protobuf procedure.</div>
@@ -17733,6 +17739,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/StoreFileReader.html#copyFields-org.apache.hadoop.hbase.regionserver.StoreFileReader-">copyFields(StoreFileReader)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/StoreFileReader.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileReader</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#copyFile-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">copyFile(FileSystem, Path, Path)</a></span> - Method in class org.apache.hadoop.hbase.backup.mapreduce.<a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html" title="class in org.apache.hadoop.hbase.backup.mapreduce">MapReduceBackupMergeJob</a></dt>
+<dd>
+<div class="block">Copy file in DFS from p to newPath</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html#copyFile-org.apache.hadoop.mapreduce.Mapper.Context-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotFileInfo-org.apache.hadoop.fs.Path-">copyFile(Mapper&lt;BytesWritable, NullWritable, NullWritable, NullWritable&gt;.Context, SnapshotProtos.SnapshotFileInfo, Path)</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html" title="class in org.apache.hadoop.hbase.snapshot">ExportSnapshot.ExportMapper</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/Result.html#copyFrom-org.apache.hadoop.hbase.client.Result-">copyFrom(Result)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></dt>
@@ -17808,6 +17818,10 @@
 <dd>
 <div class="block">The position will be set to the beginning of the new ByteBuffer</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#copyMetaData-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">copyMetaData(FileSystem, Path, Path)</a></span> - Method in class org.apache.hadoop.hbase.backup.mapreduce.<a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html" title="class in org.apache.hadoop.hbase.backup.mapreduce">MapReduceBackupMergeJob</a></dt>
+<dd>
+<div class="block">Copy meta data to of a backup session</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/ByteBufferUtils.html#copyOfRange-java.nio.ByteBuffer-int-int-">copyOfRange(ByteBuffer, int, int)</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ByteBufferUtils.html" title="class in org.apache.hadoop.hbase.util">ByteBufferUtils</a></dt>
 <dd>
 <div class="block">Similar to  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html?is-external=true#copyOfRange-byte:A-int-int-" title="class or interface in java.util"><code>Arrays.copyOfRange(byte[], int, int)</code></a></div>
@@ -23928,10 +23942,6 @@
 <dd>
 <div class="block">Keeps track of procedure ids which belong to this bitmap's range and have been deleted.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#deleteData-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">deleteData(FileSystem, Path)</a></span> - Method in class org.apache.hadoop.hbase.backup.mapreduce.<a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html" title="class in org.apache.hadoop.hbase.backup.mapreduce">MapReduceBackupMergeJob</a></dt>
-<dd>
-<div class="block">Deletes only data files and keeps all META</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html#deleteDir-org.apache.hadoop.fs.Path-">deleteDir(Path)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a></dt>
 <dd>
 <div class="block">Deletes a directory.</div>
@@ -31135,7 +31145,7 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/coprocessor/AsyncAggregationClient.html#findMedian-java.util.concurrent.CompletableFuture-org.apache.hadoop.hbase.client.AsyncTable-org.apache.hadoop.hbase.coprocessor.ColumnInterpreter-org.apache.hadoop.hbase.client.Scan-java.util.NavigableMap-">findMedian(CompletableFuture&lt;R&gt;, AsyncTable&lt;AdvancedScanResultConsumer&gt;, ColumnInterpreter&lt;R, S, P, Q, T&gt;, Scan, NavigableMap&lt;byte[], S&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.client.coprocessor.<a href="org/apache/hadoop/hbase/client/coprocessor/AsyncAggregationClient.html" title="class in org.apache.hadoop.hbase.client.coprocessor">AsyncAggregationClient</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#findMostRecentBackupId-java.lang.String:A-">findMostRecentBackupId(String[])</a></span> - Method in class org.apache.hadoop.hbase.backup.mapreduce.<a href="org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html" title="class in org.apache.hadoop.hbase.backup.mapreduce">MapReduceBackupMergeJob</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/util/BackupUtils.html#findMostRecentBackupId-java.lang.String:A-">findMostRecentBackupId(String[])</a></span> - Static method in class org.apache.hadoop.hbase.backup.util.<a href="org/apache/hadoop/hbase/backup/util/BackupUtils.html" title="class in org.apache.hadoop.hbase.backup.util">BackupUtils</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.html#findNextKeyHashPair--">findNextKeyHashPair()</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">SyncTable.SyncMapper</a></dt>
 <dd>
@@ -31159,8 +31169,6 @@
  (oldest) WAL file, and returns those regions which should be flushed so that it can be
  archived.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#findServerForRegion-java.util.Map-org.apache.hadoop.hbase.client.RegionInfo-">findServerForRegion(Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;, RegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupBasedLoadBalancer</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/ServerManager.html#findServerWithSameHostnamePortWithLock-org.apache.hadoop.hbase.ServerName-">findServerWithSameHostnamePortWithLock(ServerName)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a></dt>
 <dd>
 <div class="block">Assumes onlineServers is locked.</div>
@@ -34374,6 +34382,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/BackupInfo.html#getBackupTableInfo-org.apache.hadoop.hbase.TableName-">getBackupTableInfo(TableName)</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/BackupInfo.html" title="class in org.apache.hadoop.hbase.backup">BackupInfo</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getBackupTmpDirPath-java.lang.String-">getBackupTmpDirPath(String)</a></span> - Static method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/HBackupFileSystem.html" title="class in org.apache.hadoop.hbase.backup">HBackupFileSystem</a></dt>
+<dd>
+<div class="block">Get backup temporary directory</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getBackupTmpDirPathForBackupId-java.lang.String-java.lang.String-">getBackupTmpDirPathForBackupId(String, String)</a></span> - Static method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/HBackupFileSystem.html" title="class in org.apache.hadoop.hbase.backup">HBackupFileSystem</a></dt>
+<dd>
+<div class="block">Get backup tmp directory for backupId</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/BackupRequest.html#getBackupType--">getBackupType()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/BackupRequest.html" title="class in org.apache.hadoop.hbase.backup">BackupRequest</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/MiniZooKeeperCluster.html#getBackupZooKeeperServerNum--">getBackupZooKeeperServerNum()</a></span> - Method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/MiniZooKeeperCluster.html" title="class in org.apache.hadoop.hbase.zookeeper">MiniZooKeeperCluster</a></dt>
@@ -90225,7 +90241,7 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#repairFailedBackupDeletionIfAny-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.backup.impl.BackupSystemTable-">repairFailedBackupDeletionIfAny(Connection, BackupSystemTable)</a></span> - Method in class org.apache.hadoop.hbase.backup.impl.<a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.RepairCommand</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#repairFailedBackupMergeIfAny-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.backup.impl.BackupSystemTable-">repairFailedBackupMergeIfAny(Connection, BackupSystemTable)</a></span> - Method in class org.apache.hadoop.hbase.backup.impl.<a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.RepairCommand</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#repairFailedBackupMergeIfAny-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.backup.impl.BackupSystemTable-">repairFailedBackupMergeIfAny(Connection, BackupSystemTable)</a></span> - Static method in class org.apache.hadoop.hbase.backup.impl.<a href="org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.RepairCommand</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSourceImpl.html#repeatedBytesKey">repeatedBytesKey</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSourceImpl.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSourceImpl</a></dt>
 <dd>&nbsp;</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/HBackupFileSystem.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/HBackupFileSystem.html b/devapidocs/org/apache/hadoop/hbase/backup/HBackupFileSystem.html
index 001fc67..a670600 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/HBackupFileSystem.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/HBackupFileSystem.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -188,6 +188,19 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
+<td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getBackupTmpDirPath-java.lang.String-">getBackupTmpDirPath</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir)</code>
+<div class="block">Get backup temporary directory</div>
+</td>
+</tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getBackupTmpDirPathForBackupId-java.lang.String-java.lang.String-">getBackupTmpDirPathForBackupId</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
+                              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</code>
+<div class="block">Get backup tmp directory for backupId</div>
+</td>
+</tr>
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getLogBackupDir-java.lang.String-java.lang.String-">getLogBackupDir</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</code>
@@ -195,30 +208,30 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  backup.</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getLogBackupPath-java.lang.String-java.lang.String-">getLogBackupPath</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/backup/impl/BackupManifest.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupManifest</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getManifest-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.Path-java.lang.String-">getManifest</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
            org.apache.hadoop.fs.Path&nbsp;backupRootPath,
            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getManifestPath-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.Path-java.lang.String-">getManifestPath</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                org.apache.hadoop.fs.Path&nbsp;backupRootPath,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getTableBackupDataDir-java.lang.String-java.lang.String-org.apache.hadoop.hbase.TableName-">getTableBackupDataDir</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId,
                      <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getTableBackupDir-java.lang.String-java.lang.String-org.apache.hadoop.hbase.TableName-">getTableBackupDir</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId,
@@ -227,7 +240,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  which is also where the backup manifest file is.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getTableBackupPath-org.apache.hadoop.hbase.TableName-org.apache.hadoop.fs.Path-java.lang.String-">getTableBackupPath</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                   org.apache.hadoop.fs.Path&nbsp;backupRootPath,
@@ -316,13 +329,47 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="getBackupTmpDirPath-java.lang.String-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getBackupTmpDirPath</h4>
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.71">getBackupTmpDirPath</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir)</pre>
+<div class="block">Get backup temporary directory</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>backupRootDir</code> - backup root</dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>backup tmp directory path</dd>
+</dl>
+</li>
+</ul>
+<a name="getBackupTmpDirPathForBackupId-java.lang.String-java.lang.String-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getBackupTmpDirPathForBackupId</h4>
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.81">getBackupTmpDirPathForBackupId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRoot,
+                                                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</pre>
+<div class="block">Get backup tmp directory for backupId</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>backupRoot</code> - backup root</dd>
+<dd><code>backupId</code> - backup id</dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>backup tmp directory path</dd>
+</dl>
+</li>
+</ul>
 <a name="getTableBackupDataDir-java.lang.String-java.lang.String-org.apache.hadoop.hbase.TableName-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableBackupDataDir</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.66">getTableBackupDataDir</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.85">getTableBackupDataDir</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId,
                                            <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
@@ -333,7 +380,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getBackupPath</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.71">getBackupPath</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.90">getBackupPath</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</pre>
 </li>
 </ul>
@@ -343,7 +390,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableBackupPath</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.85">getTableBackupPath</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.104">getTableBackupPath</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                            org.apache.hadoop.fs.Path&nbsp;backupRootPath,
                                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</pre>
 <div class="block">Given the backup root dir, backup id and the table name, return the backup image location,
@@ -366,7 +413,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogBackupDir</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.96">getLogBackupDir</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.115">getLogBackupDir</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</pre>
 <div class="block">Given the backup root dir and the backup id, return the log file location for an incremental
  backup.</div>
@@ -385,7 +432,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogBackupPath</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.101">getLogBackupPath</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.120">getLogBackupPath</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupRootDir,
                                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)</pre>
 </li>
 </ul>
@@ -395,7 +442,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getManifestPath</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.107">getManifestPath</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.126">getManifestPath</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                          org.apache.hadoop.fs.Path&nbsp;backupRootPath,
                                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)
                                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -411,7 +458,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getManifest</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/impl/BackupManifest.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupManifest</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.124">getManifest</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/backup/impl/BackupManifest.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupManifest</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.143">getManifest</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                          org.apache.hadoop.fs.Path&nbsp;backupRootPath,
                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;backupId)
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -427,7 +474,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkImageManifestExist</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.136">checkImageManifestExist</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../org/apache/hadoop/hbase/backup/impl/BackupManifest.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupManifest</a>&gt;&nbsp;backupManifestMap,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.155">checkImageManifestExist</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../org/apache/hadoop/hbase/backup/impl/BackupManifest.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupManifest</a>&gt;&nbsp;backupManifestMap,
                                            <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[]&nbsp;tableArray,
                                            org.apache.hadoop.conf.Configuration&nbsp;conf,
                                            org.apache.hadoop.fs.Path&nbsp;backupRootPath,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html
index a09f965..aa3adbc 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html
@@ -843,7 +843,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupAdmin
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkIfValidForMerge</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html#line.641">checkIfValidForMerge</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupAdminImpl.html#line.642">checkIfValidForMerge</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;backupIds,
                                   <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a>&nbsp;table)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Verifies that backup images are valid for merge.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html
index 0323bbc..5618be5 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.865">BackupCommands.BackupSetCommand</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.901">BackupCommands.BackupSetCommand</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></pre>
 </li>
 </ul>
@@ -285,7 +285,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>SET_ADD_CMD</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.866">SET_ADD_CMD</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.902">SET_ADD_CMD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.backup.impl.BackupCommands.BackupSetCommand.SET_ADD_CMD">Constant Field Values</a></dd>
@@ -298,7 +298,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>SET_REMOVE_CMD</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.867">SET_REMOVE_CMD</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.903">SET_REMOVE_CMD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.backup.impl.BackupCommands.BackupSetCommand.SET_REMOVE_CMD">Constant Field Values</a></dd>
@@ -311,7 +311,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>SET_DELETE_CMD</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.868">SET_DELETE_CMD</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.904">SET_DELETE_CMD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.backup.impl.BackupCommands.BackupSetCommand.SET_DELETE_CMD">Constant Field Values</a></dd>
@@ -324,7 +324,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>SET_DESCRIBE_CMD</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.869">SET_DESCRIBE_CMD</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.905">SET_DESCRIBE_CMD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.backup.impl.BackupCommands.BackupSetCommand.SET_DESCRIBE_CMD">Constant Field Values</a></dd>
@@ -337,7 +337,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SET_LIST_CMD</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.870">SET_LIST_CMD</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.906">SET_LIST_CMD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.backup.impl.BackupCommands.BackupSetCommand.SET_LIST_CMD">Constant Field Values</a></dd>
@@ -358,7 +358,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BackupSetCommand</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.872">BackupSetCommand</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.908">BackupSetCommand</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                  org.apache.commons.cli.CommandLine&nbsp;cmdline)</pre>
 </li>
 </ul>
@@ -376,7 +376,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>execute</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.878">execute</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.914">execute</a>()
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -392,7 +392,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>processSetList</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.910">processSetList</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.946">processSetList</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -406,7 +406,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>processSetDescribe</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.923">processSetDescribe</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.959">processSetDescribe</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -420,7 +420,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>processSetDelete</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.942">processSetDelete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.978">processSetDelete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -434,7 +434,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>processSetRemove</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.960">processSetRemove</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.996">processSetRemove</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -448,7 +448,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>toTableNames</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.975">toTableNames</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;tables)</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.1011">toTableNames</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;tables)</pre>
 </li>
 </ul>
 <a name="processSetAdd-java.lang.String:A-">
@@ -457,7 +457,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>processSetAdd</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.983">processSetAdd</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.1019">processSetAdd</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -471,7 +471,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>getCommand</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup">BackupRestoreConstants.BackupCommand</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.1002">getCommand</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmdStr)
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup">BackupRestoreConstants.BackupCommand</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.1038">getCommand</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmdStr)
                                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -485,7 +485,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.1022">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.1058">printUsage</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html#printUsage--">printUsage</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html
index 708ff66..57aa892 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DeleteCommand.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.550">BackupCommands.DeleteCommand</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.550">BackupCommands.DeleteCommand</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html
index 6225193..5de92de 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.DescribeCommand.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.457">BackupCommands.DescribeCommand</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.457">BackupCommands.DescribeCommand</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html
index 6342425..b9a6076 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HelpCommand.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.406">BackupCommands.HelpCommand</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.406">BackupCommands.HelpCommand</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html
index 6e1c129..d653bda 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.742">BackupCommands.HistoryCommand</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.778">BackupCommands.HistoryCommand</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></pre>
 </li>
 </ul>
@@ -257,7 +257,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_HISTORY_LENGTH</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.743">DEFAULT_HISTORY_LENGTH</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.779">DEFAULT_HISTORY_LENGTH</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.backup.impl.BackupCommands.HistoryCommand.DEFAULT_HISTORY_LENGTH">Constant Field Values</a></dd>
@@ -278,7 +278,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HistoryCommand</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.745">HistoryCommand</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.781">HistoryCommand</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                org.apache.commons.cli.CommandLine&nbsp;cmdline)</pre>
 </li>
 </ul>
@@ -296,7 +296,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>execute</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.751">execute</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.787">execute</a>()
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -312,7 +312,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>getBackupRootPath</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.795">getBackupRootPath</a>()
+<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.831">getBackupRootPath</a>()
                                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -326,7 +326,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.812">getTableName</a>()
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.848">getTableName</a>()
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -340,7 +340,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableSetName</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.828">getTableSetName</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.864">getTableSetName</a>()</pre>
 </li>
 </ul>
 <a name="parseHistoryLength--">
@@ -349,7 +349,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>parseHistoryLength</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.832">parseHistoryLength</a>()
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.868">parseHistoryLength</a>()
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -363,7 +363,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.848">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.884">printUsage</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html#printUsage--">printUsage</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html
index 871b1b3..3fa925f 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.693">BackupCommands.MergeCommand</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.729">BackupCommands.MergeCommand</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></pre>
 </li>
 </ul>
@@ -243,7 +243,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MergeCommand</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.694">MergeCommand</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.730">MergeCommand</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
              org.apache.commons.cli.CommandLine&nbsp;cmdline)</pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>requiresNoActiveSession</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.700">requiresNoActiveSession</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.736">requiresNoActiveSession</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html#requiresNoActiveSession--">BackupCommands.Command</a></code></span></div>
 <div class="block">The command can't be run if active backup session is in progress</div>
 <dl>
@@ -278,7 +278,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>requiresConsistentState</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.705">requiresConsistentState</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.741">requiresConsistentState</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html#requiresConsistentState--">BackupCommands.Command</a></code></span></div>
 <div class="block">Command requires consistent state of a backup system Backup system may become inconsistent
  because of an abnormal termination of a backup session or delete command</div>
@@ -296,7 +296,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockList">
 <li class="blockList">
 <h4>execute</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.710">execute</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.746">execute</a>()
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -312,7 +312,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.737">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.773">printUsage</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html#printUsage--">printUsage</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html
index 41a42b8..f3287e0 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/impl/BackupCommands.ProgressCommand.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.495">BackupCommands.ProgressCommand</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.html#line.495">BackupCommands.ProgressCommand</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupCommands.Command.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupCommands.Command</a></pre>
 </li>
 </ul>


[12/25] hbase-site git commit: Published site at d5aaeee88b331e064830a2774f4fed238631457c.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/89e23f78/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html
index 667152a..a12ad81 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html
@@ -66,13 +66,13 @@
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.backup.BackupRestoreConstants.BackupCommand;<a name="line.59"></a>
 <span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.backup.BackupType;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.backup.HBackupFileSystem;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.backup.util.BackupSet;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.67"></a>
 <span class="sourceLineNo">068</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
 <span class="sourceLineNo">070</span>/**<a name="line.70"></a>
@@ -411,7 +411,7 @@
 <span class="sourceLineNo">403</span>    }<a name="line.403"></a>
 <span class="sourceLineNo">404</span>  }<a name="line.404"></a>
 <span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private static class HelpCommand extends Command {<a name="line.406"></a>
+<span class="sourceLineNo">406</span>  public static class HelpCommand extends Command {<a name="line.406"></a>
 <span class="sourceLineNo">407</span>    HelpCommand(Configuration conf, CommandLine cmdline) {<a name="line.407"></a>
 <span class="sourceLineNo">408</span>      super(conf);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>      this.cmdline = cmdline;<a name="line.409"></a>
@@ -462,7 +462,7 @@
 <span class="sourceLineNo">454</span>    }<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  private static class DescribeCommand extends Command {<a name="line.457"></a>
+<span class="sourceLineNo">457</span>  public static class DescribeCommand extends Command {<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    DescribeCommand(Configuration conf, CommandLine cmdline) {<a name="line.458"></a>
 <span class="sourceLineNo">459</span>      super(conf);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>      this.cmdline = cmdline;<a name="line.460"></a>
@@ -500,7 +500,7 @@
 <span class="sourceLineNo">492</span>    }<a name="line.492"></a>
 <span class="sourceLineNo">493</span>  }<a name="line.493"></a>
 <span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>  private static class ProgressCommand extends Command {<a name="line.495"></a>
+<span class="sourceLineNo">495</span>  public static class ProgressCommand extends Command {<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    ProgressCommand(Configuration conf, CommandLine cmdline) {<a name="line.496"></a>
 <span class="sourceLineNo">497</span>      super(conf);<a name="line.497"></a>
 <span class="sourceLineNo">498</span>      this.cmdline = cmdline;<a name="line.498"></a>
@@ -555,7 +555,7 @@
 <span class="sourceLineNo">547</span>    }<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private static class DeleteCommand extends Command {<a name="line.550"></a>
+<span class="sourceLineNo">550</span>  public static class DeleteCommand extends Command {<a name="line.550"></a>
 <span class="sourceLineNo">551</span>    DeleteCommand(Configuration conf, CommandLine cmdline) {<a name="line.551"></a>
 <span class="sourceLineNo">552</span>      super(conf);<a name="line.552"></a>
 <span class="sourceLineNo">553</span>      this.cmdline = cmdline;<a name="line.553"></a>
@@ -594,7 +594,7 @@
 <span class="sourceLineNo">586</span>    }<a name="line.586"></a>
 <span class="sourceLineNo">587</span>  }<a name="line.587"></a>
 <span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static class RepairCommand extends Command {<a name="line.589"></a>
+<span class="sourceLineNo">589</span>  public static class RepairCommand extends Command {<a name="line.589"></a>
 <span class="sourceLineNo">590</span>    RepairCommand(Configuration conf, CommandLine cmdline) {<a name="line.590"></a>
 <span class="sourceLineNo">591</span>      super(conf);<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      this.cmdline = cmdline;<a name="line.592"></a>
@@ -669,369 +669,405 @@
 <span class="sourceLineNo">661</span>      System.out.println("DELETE operation finished OK: " + StringUtils.join(backupIds));<a name="line.661"></a>
 <span class="sourceLineNo">662</span>    }<a name="line.662"></a>
 <span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    private void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
+<span class="sourceLineNo">664</span>    public static void repairFailedBackupMergeIfAny(Connection conn, BackupSystemTable sysTable)<a name="line.664"></a>
 <span class="sourceLineNo">665</span>        throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        System.out.println("No failed backup MERGE operation found");<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        // Delete backup table snapshot if exists<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        return;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      System.out.println("Running MERGE again ...");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      // Restore table from snapshot<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      // Unlock backupo system<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      sysTable.finishBackupExclusiveOperation();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      // Finish previous failed session<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      sysTable.finishMergeOperation();<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      try (BackupAdmin admin = new BackupAdminImpl(conn)) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        admin.mergeBackups(backupIds);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      System.out.println("MERGE operation finished OK: " + StringUtils.join(backupIds));<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>    @Override<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    protected void printUsage() {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private static class MergeCommand extends Command {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      super(conf);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      this.cmdline = cmdline;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>    @Override<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    protected boolean requiresNoActiveSession() {<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      return true;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    @Override<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    protected boolean requiresConsistentState() {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      return true;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>    @Override<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    public void execute() throws IOException {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      super.execute();<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      if (args == null || (args.length != 2)) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            + (args == null ? null : args.length));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        printUsage();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        throw new IOException(INCORRECT_USAGE);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>      String[] backupIds = args[1].split(",");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      if (backupIds.length &lt; 2) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.723"></a>
-<span class="sourceLineNo">724</span>            "Number of images must be greater than 1.";<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        System.err.println(msg);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        throw new IOException(msg);<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        admin.mergeBackups(backupIds);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    }<a name="line.734"></a>
-<span class="sourceLineNo">735</span><a name="line.735"></a>
-<span class="sourceLineNo">736</span>    @Override<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    protected void printUsage() {<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  private static class HistoryCommand extends Command {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.743"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>      String[] backupIds = sysTable.getListOfBackupIdsFromMergeOperation();<a name="line.667"></a>
+<span class="sourceLineNo">668</span>      if (backupIds == null || backupIds.length == 0) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        System.out.println("No failed backup MERGE operation found");<a name="line.669"></a>
+<span class="sourceLineNo">670</span>        // Delete backup table snapshot if exists<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        BackupSystemTable.deleteSnapshot(conn);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>        return;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      System.out.println("Found failed MERGE operation for: " + StringUtils.join(backupIds));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      // Check if backup .tmp exists<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      BackupInfo bInfo = sysTable.readBackupInfo(backupIds[0]);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      String backupRoot = bInfo.getBackupRootDir();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(new Path(backupRoot).toUri(), new Configuration());<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      String backupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      Path tmpPath = HBackupFileSystem.getBackupTmpDirPathForBackupId(backupRoot, backupId);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      if (fs.exists(tmpPath)) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        // Move data back<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        Path destPath = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        if (!fs.delete(destPath, true)) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>          System.out.println("Failed to delete " + destPath);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        boolean res = fs.rename(tmpPath, destPath);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>        if (!res) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>          throw new IOException("MERGE repair: failed  to rename from "+ tmpPath+" to "+ destPath);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        }<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        System.out.println("MERGE repair: renamed from "+ tmpPath+" to "+ destPath+" res="+ res);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      } else {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        checkRemoveBackupImages(fs, backupRoot, backupIds);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      // Restore table from snapshot<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      BackupSystemTable.restoreFromSnapshot(conn);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      // Unlock backup system<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      sysTable.finishBackupExclusiveOperation();<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      // Finish previous failed session<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      sysTable.finishMergeOperation();<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      System.out.println("MERGE repair operation finished OK: " + StringUtils.join(backupIds));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    private static void checkRemoveBackupImages(FileSystem fs, String backupRoot,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      String[] backupIds) throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      String mergedBackupId = BackupUtils.findMostRecentBackupId(backupIds);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      for (String backupId: backupIds) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        if (backupId.equals(mergedBackupId)) {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>          continue;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        Path path = HBackupFileSystem.getBackupPath(backupRoot, backupId);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        if (fs.exists(path)) {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>          if (!fs.delete(path, true)) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>            System.out.println("MERGE repair removing: "+ path +" - FAILED");<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          } else {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>            System.out.println("MERGE repair removing: "+ path +" - OK");<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    @Override<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    protected void printUsage() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      System.out.println(REPAIR_CMD_USAGE);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>  public static class MergeCommand extends Command {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    MergeCommand(Configuration conf, CommandLine cmdline) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      super(conf);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      this.cmdline = cmdline;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    @Override<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    protected boolean requiresNoActiveSession() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      return true;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>    @Override<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    protected boolean requiresConsistentState() {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      return true;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
 <span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      super(conf);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.cmdline = cmdline;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    @Override<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    public void execute() throws IOException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      int n = parseHistoryLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      final TableName tableName = getTableName();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      final String setName = getTableSetName();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        public boolean apply(BackupInfo info) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>          if (tableName == null) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            return true;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          }<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          return names.contains(tableName);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      };<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        @Override<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        public boolean apply(BackupInfo info) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          if (setName == null) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            return true;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>          String backupId = info.getBackupId();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>          return backupId.startsWith(setName);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      };<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      Path backupRootPath = getBackupRootPath();<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      List&lt;BackupInfo&gt; history;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      if (backupRootPath == null) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        // Load from backup system table<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        super.execute();<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      } else {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        // load from backup FS<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        history =<a name="line.787"></a>
-<span class="sourceLineNo">788</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      for (BackupInfo info : history) {<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        System.out.println(info.getShortDescription());<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>    private Path getBackupRootPath() throws IOException {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      String value = null;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      try {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>        if (value == null) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          return null;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>        return new Path(value);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      } catch (IllegalArgumentException e) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>        printUsage();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>        throw new IOException(INCORRECT_USAGE);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>    private TableName getTableName() throws IOException {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>      if (value == null) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        return null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return TableName.valueOf(value);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } catch (IllegalArgumentException e) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        printUsage();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        throw new IOException(INCORRECT_USAGE);<a name="line.824"></a>
+<span class="sourceLineNo">745</span>    @Override<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    public void execute() throws IOException {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      super.execute();<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>      String[] args = cmdline == null ? null : cmdline.getArgs();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (args == null || (args.length != 2)) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        System.err.println("ERROR: wrong number of arguments: "<a name="line.751"></a>
+<span class="sourceLineNo">752</span>            + (args == null ? null : args.length));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        printUsage();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        throw new IOException(INCORRECT_USAGE);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>      String[] backupIds = args[1].split(",");<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      if (backupIds.length &lt; 2) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        String msg = "ERROR: can not merge a single backup image. "+<a name="line.759"></a>
+<span class="sourceLineNo">760</span>            "Number of images must be greater than 1.";<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        System.err.println(msg);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        throw new IOException(msg);<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      Configuration conf = getConf() != null ? getConf() : HBaseConfiguration.create();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      try (final Connection conn = ConnectionFactory.createConnection(conf);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>          final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>        admin.mergeBackups(backupIds);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    }<a name="line.770"></a>
+<span class="sourceLineNo">771</span><a name="line.771"></a>
+<span class="sourceLineNo">772</span>    @Override<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    protected void printUsage() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      System.out.println(MERGE_CMD_USAGE);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  }<a name="line.776"></a>
+<span class="sourceLineNo">777</span><a name="line.777"></a>
+<span class="sourceLineNo">778</span>  public static class HistoryCommand extends Command {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private final static int DEFAULT_HISTORY_LENGTH = 10;<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    HistoryCommand(Configuration conf, CommandLine cmdline) {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      super(conf);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      this.cmdline = cmdline;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    @Override<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    public void execute() throws IOException {<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      int n = parseHistoryLength();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      final TableName tableName = getTableName();<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      final String setName = getTableSetName();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      BackupInfo.Filter tableNameFilter = new BackupInfo.Filter() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        @Override<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        public boolean apply(BackupInfo info) {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          if (tableName == null) {<a name="line.794"></a>
+<span class="sourceLineNo">795</span>            return true;<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          }<a name="line.796"></a>
+<span class="sourceLineNo">797</span><a name="line.797"></a>
+<span class="sourceLineNo">798</span>          List&lt;TableName&gt; names = info.getTableNames();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>          return names.contains(tableName);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      };<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BackupInfo.Filter tableSetFilter = new BackupInfo.Filter() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        @Override<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        public boolean apply(BackupInfo info) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>          if (setName == null) {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>            return true;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>          String backupId = info.getBackupId();<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          return backupId.startsWith(setName);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      };<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      Path backupRootPath = getBackupRootPath();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      List&lt;BackupInfo&gt; history;<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      if (backupRootPath == null) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        // Load from backup system table<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        super.execute();<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>          history = sysTable.getBackupHistory(n, tableNameFilter, tableSetFilter);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        }<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>        // load from backup FS<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        history =<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            BackupUtils.getHistory(getConf(), n, backupRootPath, tableNameFilter, tableSetFilter);<a name="line.824"></a>
 <span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span><a name="line.827"></a>
-<span class="sourceLineNo">828</span>    private String getTableSetName() {<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>    private int parseHistoryLength() throws IOException {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      try {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (value == null) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>        return Integer.parseInt(value);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (NumberFormatException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        printUsage();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        throw new IOException(INCORRECT_USAGE);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    protected void printUsage() {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      Options options = new Options();<a name="line.850"></a>
-<span class="sourceLineNo">851</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.854"></a>
-<span class="sourceLineNo">855</span><a name="line.855"></a>
-<span class="sourceLineNo">856</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      helpFormatter.setLeftPadding(2);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      helpFormatter.setDescPadding(8);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      helpFormatter.setWidth(100);<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.861"></a>
+<span class="sourceLineNo">826</span>      for (BackupInfo info : history) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        System.out.println(info.getShortDescription());<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    private Path getBackupRootPath() throws IOException {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      String value = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      try {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>        value = cmdline.getOptionValue(OPTION_PATH);<a name="line.834"></a>
+<span class="sourceLineNo">835</span><a name="line.835"></a>
+<span class="sourceLineNo">836</span>        if (value == null) {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          return null;<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>        return new Path(value);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      } catch (IllegalArgumentException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>        System.out.println("ERROR: Illegal argument for backup root path: " + value);<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        printUsage();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        throw new IOException(INCORRECT_USAGE);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    private TableName getTableName() throws IOException {<a name="line.848"></a>
+<span class="sourceLineNo">849</span>      String value = cmdline.getOptionValue(OPTION_TABLE);<a name="line.849"></a>
+<span class="sourceLineNo">850</span><a name="line.850"></a>
+<span class="sourceLineNo">851</span>      if (value == null) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        return null;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>      try {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>        return TableName.valueOf(value);<a name="line.856"></a>
+<span class="sourceLineNo">857</span>      } catch (IllegalArgumentException e) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        System.out.println("Illegal argument for table name: " + value);<a name="line.858"></a>
+<span class="sourceLineNo">859</span>        printUsage();<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        throw new IOException(INCORRECT_USAGE);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    }<a name="line.862"></a>
-<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>  private static class BackupSetCommand extends Command {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    private final static String SET_ADD_CMD = "add";<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    private final static String SET_LIST_CMD = "list";<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      super(conf);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      this.cmdline = cmdline;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>    @Override<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    public void execute() throws IOException {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // Command-line must have at least one element<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        printUsage();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        throw new IOException(INCORRECT_USAGE);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      }<a name="line.883"></a>
-<span class="sourceLineNo">884</span><a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String[] args = cmdline.getArgs();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      String cmdStr = args[1];<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>      switch (cmd) {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        case SET_ADD:<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          processSetAdd(args);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          break;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        case SET_REMOVE:<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          processSetRemove(args);<a name="line.894"></a>
-<span class="sourceLineNo">895</span>          break;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        case SET_DELETE:<a name="line.896"></a>
-<span class="sourceLineNo">897</span>          processSetDelete(args);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          break;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        case SET_DESCRIBE:<a name="line.899"></a>
-<span class="sourceLineNo">900</span>          processSetDescribe(args);<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          break;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        case SET_LIST:<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          processSetList(args);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          break;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>        default:<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          break;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    private void processSetList(String[] args) throws IOException {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      super.execute();<a name="line.911"></a>
+<span class="sourceLineNo">863</span><a name="line.863"></a>
+<span class="sourceLineNo">864</span>    private String getTableSetName() {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      return cmdline.getOptionValue(OPTION_SET);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>    private int parseHistoryLength() throws IOException {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      String value = cmdline.getOptionValue(OPTION_RECORD_NUMBER);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      try {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>        if (value == null) {<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          return DEFAULT_HISTORY_LENGTH;<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>        return Integer.parseInt(value);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      } catch (NumberFormatException e) {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        System.out.println("Illegal argument for history length: " + value);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        printUsage();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        throw new IOException(INCORRECT_USAGE);<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      }<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span><a name="line.882"></a>
+<span class="sourceLineNo">883</span>    @Override<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    protected void printUsage() {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      System.out.println(HISTORY_CMD_USAGE);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>      Options options = new Options();<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      options.addOption(OPTION_RECORD_NUMBER, true, OPTION_RECORD_NUMBER_DESC);<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      options.addOption(OPTION_PATH, true, OPTION_PATH_DESC);<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      options.addOption(OPTION_TABLE, true, OPTION_TABLE_DESC);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>      options.addOption(OPTION_SET, true, OPTION_SET_DESC);<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>      HelpFormatter helpFormatter = new HelpFormatter();<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      helpFormatter.setLeftPadding(2);<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      helpFormatter.setDescPadding(8);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      helpFormatter.setWidth(100);<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      helpFormatter.setSyntaxPrefix("Options:");<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      helpFormatter.printHelp(" ", null, options, USAGE_FOOTER);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>  }<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>  public static class BackupSetCommand extends Command {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    private final static String SET_ADD_CMD = "add";<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    private final static String SET_REMOVE_CMD = "remove";<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    private final static String SET_DELETE_CMD = "delete";<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    private final static String SET_DESCRIBE_CMD = "describe";<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    private final static String SET_LIST_CMD = "list";<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    BackupSetCommand(Configuration conf, CommandLine cmdline) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      super(conf);<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      this.cmdline = cmdline;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>    }<a name="line.911"></a>
 <span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>      // List all backup set names<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // does not expect any args<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        for (BackupSet bs : list) {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          System.out.println(bs);<a name="line.918"></a>
-<span class="sourceLineNo">919</span>        }<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (args == null || args.length != 3) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        printUsage();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        throw new IOException(INCORRECT_USAGE);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      super.execute();<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      String setName = args[2];<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        if (set == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        } else {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>          System.out.println(set);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      if (args == null || args.length != 3) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        printUsage();<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throw new IOException(INCORRECT_USAGE);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
+<span class="sourceLineNo">913</span>    @Override<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    public void execute() throws IOException {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // Command-line must have at least one element<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      if (cmdline == null || cmdline.getArgs() == null || cmdline.getArgs().length &lt; 2) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>        printUsage();<a name="line.917"></a>
+<span class="sourceLineNo">918</span>        throw new IOException(INCORRECT_USAGE);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>      }<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>      String[] args = cmdline.getArgs();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      String cmdStr = args[1];<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      BackupCommand cmd = getCommand(cmdStr);<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      switch (cmd) {<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        case SET_ADD:<a name="line.926"></a>
+<span class="sourceLineNo">927</span>          processSetAdd(args);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>          break;<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        case SET_REMOVE:<a name="line.929"></a>
+<span class="sourceLineNo">930</span>          processSetRemove(args);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          break;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        case SET_DELETE:<a name="line.932"></a>
+<span class="sourceLineNo">933</span>          processSetDelete(args);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>          break;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>        case SET_DESCRIBE:<a name="line.935"></a>
+<span class="sourceLineNo">936</span>          processSetDescribe(args);<a name="line.936"></a>
+<span class="sourceLineNo">937</span>          break;<a name="line.937"></a>
+<span class="sourceLineNo">938</span>        case SET_LIST:<a name="line.938"></a>
+<span class="sourceLineNo">939</span>          processSetList(args);<a name="line.939"></a>
+<span class="sourceLineNo">940</span>          break;<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        default:<a name="line.941"></a>
+<span class="sourceLineNo">942</span>          break;<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span><a name="line.945"></a>
+<span class="sourceLineNo">946</span>    private void processSetList(String[] args) throws IOException {<a name="line.946"></a>
 <span class="sourceLineNo">947</span>      super.execute();<a name="line.947"></a>
 <span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      String setName = args[2];<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        if (result) {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        } else {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>          System.out.println("Set " + setName + " does not exist");<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        }<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      if (args == null || args.length != 4) {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        printUsage();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throw new IOException(INCORRECT_USAGE);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      super.execute();<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>      String setName = args[2];<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      String[] tables = args[3].split(",");<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      TableName[] tableNames = toTableNames(tables);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    }<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    private TableName[] toTableNames(String[] tables) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      TableName[] arr = new TableName[tables.length];<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
-<span class="sourceLineNo">980</span>      return arr;<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      if (args == null || args.length != 4) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        printUsage();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        throw new IOException(INCORRECT_USAGE);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      super.execute();<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      String setName = args[2];<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      String[] tables = args[3].split(",");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.993"></a>
-<span class="sourceLineNo">994</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      }<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        admin.addToBackupSet(setName, tableNames);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>      }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span><a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      switch (cmdStr) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>        case SET_ADD_CMD:<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>          return BackupCommand.SET_ADD;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>        case SET_REMOVE_CMD:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>          return BackupCommand.SET_REMOVE;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        case SET_DELETE_CMD:<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>          return BackupCommand.SET_DELETE;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        case SET_DESCRIBE_CMD:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        case SET_LIST_CMD:<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          return BackupCommand.SET_LIST;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        default:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          printUsage();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    }<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span><a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    @Override<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    protected void printUsage() {<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      System.out.println(SET_CMD_USAGE);<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>}<a name="line.1026"></a>
+<span class="sourceLineNo">949</span>      // List all backup set names<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      // does not expect any args<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      try (BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>        List&lt;BackupSet&gt; list = admin.listBackupSets();<a name="line.952"></a>
+<span class="sourceLineNo">953</span>        for (BackupSet bs : list) {<a name="line.953"></a>
+<span class="sourceLineNo">954</span>          System.out.println(bs);<a name="line.954"></a>
+<span class="sourceLineNo">955</span>        }<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    private void processSetDescribe(String[] args) throws IOException {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      if (args == null || args.length != 3) {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        printUsage();<a name="line.961"></a>
+<span class="sourceLineNo">962</span>        throw new IOException(INCORRECT_USAGE);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      super.execute();<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>      String setName = args[2];<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      try (final BackupSystemTable sysTable = new BackupSystemTable(conn)) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        List&lt;TableName&gt; tables = sysTable.describeBackupSet(setName);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>        BackupSet set = tables == null ? null : new BackupSet(setName, tables);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>        if (set == null) {<a name="line.970"></a>
+<span class="sourceLineNo">971</span>          System.out.println("Set '" + setName + "' does not exist.");<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        } else {<a name="line.972"></a>
+<span class="sourceLineNo">973</span>          System.out.println(set);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        }<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    }<a name="line.976"></a>
+<span class="sourceLineNo">977</span><a name="line.977"></a>
+<span class="sourceLineNo">978</span>    private void processSetDelete(String[] args) throws IOException {<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      if (args == null || args.length != 3) {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        printUsage();<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        throw new IOException(INCORRECT_USAGE);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      super.execute();<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>      String setName = args[2];<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        boolean result = admin.deleteBackupSet(setName);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        if (result) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>          System.out.println("Delete set " + setName + " OK.");<a name="line.989"></a>
+<span class="sourceLineNo">990</span>        } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>          System.out.println("Set " + setName + " does not exist");<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>    private void processSetRemove(String[] args) throws IOException {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>      if (args == null || args.length != 4) {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        printUsage();<a name="line.998"></a>
+<span class="sourceLineNo">999</span>        throw new IOException(INCORRECT_USAGE);<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      }<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      super.execute();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span><a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      String setName = args[2];<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>      String[] tables = args[3].split(",");<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      TableName[] tableNames = toTableNames(tables);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>        admin.removeFromBackupSet(setName, tableNames);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    private TableName[] toTableNames(String[] tables) {<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>      TableName[] arr = new TableName[tables.length];<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>        arr[i] = TableName.valueOf(tables[i]);<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      return arr;<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    private void processSetAdd(String[] args) throws IOException {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>      if (args == null || args.length != 4) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>        printUsage();<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>        throw new IOException(INCORRECT_USAGE);<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      super.execute();<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      String setName = args[2];<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      String[] tables = args[3].split(",");<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      TableName[] tableNames = new TableName[tables.length];<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>      for (int i = 0; i &lt; tables.length; i++) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>        tableNames[i] = TableName.valueOf(tables[i]);<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      try (final BackupAdminImpl admin = new BackupAdminImpl(conn)) {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        admin.addToBackupSet(setName, tableNames);<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      }<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span><a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span><a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    private BackupCommand getCommand(String cmdStr) throws IOException {<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      switch (cmdStr) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>        case SET_ADD_CMD:<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          return BackupCommand.SET_ADD;<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        case SET_REMOVE_CMD:<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          return BackupCommand.SET_REMOVE;<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>        case SET_DELETE_CMD:<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>          return BackupCommand.SET_DELETE;<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        case SET_DESCRIBE_CMD:<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>          return BackupCommand.SET_DESCRIBE;<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        case SET_LIST_CMD:<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>          return BackupCommand.SET_LIST;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        default:<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>          System.out.println("ERROR: Unknown command for 'set' :" + cmdStr);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>          printUsage();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          throw new IOException(INCORRECT_USAGE);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>    @Override<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    protected void printUsage() {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      System.out.println(SET_CMD_USAGE);<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>