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<Pair<TableName, Path>> processedTableList = new ArrayList<>();<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 < 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<>(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<TableName> 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<TableName, Path> 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<String> 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 && 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<TableName> 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<Pair<TableName, Path>> processedTableList = new ArrayList<>();<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 < 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<>(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<TableName> 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<TableName, Path> 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<String> 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 && 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<TableName> 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() < 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() < 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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 – 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="" /> Warnings</th>
<th><img src="images/icon_error_sml.gif" alt="" /> 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 –
Apache HBase (TM) Metrics
@@ -452,7 +452,7 @@ export HBASE_REGIONSERVER_OPTS="$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 –
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 – 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 – 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 – 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 – 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 – 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 – 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 –
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 –
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 – 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 – 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 – 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 – 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 – 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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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 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 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 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 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 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 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 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 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All 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: </li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.backup.TestBackupBase">Nested</a> | </li>
+<li><a href="#field.summary">Field</a> | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail: </li>
+<li><a href="#field.detail">Field</a> | </li>
+<li><a href="#constructor.detail">Constr</a> | </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 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"> </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> </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> </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 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"> </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> </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"> </span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd"> </span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd"> </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> </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 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 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 <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 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 <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 void <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 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 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All 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: </li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.backup.TestBackupBase">Nested</a> | </li>
+<li><a href="#field.summary">Field</a> | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail: </li>
+<li><a href="#field.detail">Field</a> | </li>
+<li><a href="#constructor.detail">Constr</a> | </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 © 2007–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 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 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 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 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 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 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 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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.74">setConf</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.BackupMergeJobWithFailures.html#line.75">setConf</a>(org.apache.hadoop.conf.Configuration conf)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>setConf</code> in interface <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 void <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>[] backupIds)
+<pre>public void <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>[] 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 void <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> phase)
+<pre>private void <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> 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><<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup">TestIncrementalBackupMergeWithFailures.FailurePhase</a>></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 <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 <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 <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 <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 <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 <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 <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 <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 <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.64">values</a>()</pre>
+<pre>public static <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">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 <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.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> name)</pre>
+<pre>public static <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">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> 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 <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 <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 org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.61">LOG</a></pre>
+<pre>private static final 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 <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 <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.55">TestIncrementalBackupMergeWithFailures</a>()</pre>
+<pre>public <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.html#line.206">TestIncBackupMergeRestore</a>()
+<pre>public void <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 </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> </td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>class </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 </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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 </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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 </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>class </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> </td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>class </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> </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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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<Pair<TableName, Path>> processedTableList = new ArrayList<>();<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 < 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<>(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<TableName> 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<TableName, Path> 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<String> 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 && 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<TableName> 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<Pair<TableName, Path>> processedTableList = new ArrayList<>();<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 < 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<>(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<TableName> 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<TableName, Path> 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<String> 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 && 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<TableName> 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() < 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() < 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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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><<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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</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#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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)</code> </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><E> (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><T>, 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><T>)</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><T>)</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><T>)</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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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><E> (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><T>, 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<TableName, BackupManifest> 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<TableName, BackupManifest> 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> * <ul><a name="line.630"></a>
-<span class="sourceLineNo">631</span> * <li>All backups MUST be in the same destination<a name="line.631"></a>
-<span class="sourceLineNo">632</span> * <li>No FULL backups are allowed - only INCREMENTAL<a name="line.632"></a>
-<span class="sourceLineNo">633</span> * <li>All backups must be in COMPLETE state<a name="line.633"></a>
-<span class="sourceLineNo">634</span> * <li>No holes in backup list are allowed<a name="line.634"></a>
-<span class="sourceLineNo">635</span> * </ul><a name="line.635"></a>
-<span class="sourceLineNo">636</span> * <p><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<TableName> allTables = new HashSet<>();<a name="line.645"></a>
-<span class="sourceLineNo">646</span> final Set<String> allBackups = new HashSet<>();<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 < 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 > 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 -> 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 -> {<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 >= startRangeTime && time <= 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 -> {<a name="line.693"></a>
-<span class="sourceLineNo">694</span> List<TableName> 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 -> info.getType() == BackupType.INCREMENTAL;<a name="line.698"></a>
-<span class="sourceLineNo">699</span> BackupInfo.Filter stateFilter = info -> 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<BackupInfo> 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<String> missingIds = new ArrayList<>();<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> * <ul><a name="line.631"></a>
+<span class="sourceLineNo">632</span> * <li>All backups MUST be in the same destination<a name="line.632"></a>
+<span class="sourceLineNo">633</span> * <li>No FULL backups are allowed - only INCREMENTAL<a name="line.633"></a>
+<span class="sourceLineNo">634</span> * <li>All backups must be in COMPLETE state<a name="line.634"></a>
+<span class="sourceLineNo">635</span> * <li>No holes in backup list are allowed<a name="line.635"></a>
+<span class="sourceLineNo">636</span> * </ul><a name="line.636"></a>
+<span class="sourceLineNo">637</span> * <p><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<TableName> allTables = new HashSet<>();<a name="line.646"></a>
+<span class="sourceLineNo">647</span> final Set<String> allBackups = new HashSet<>();<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 < 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 > 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 -> 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 -> {<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 >= startRangeTime && time <= 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 -> {<a name="line.694"></a>
+<span class="sourceLineNo">695</span> List<TableName> 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 -> info.getType() == BackupType.INCREMENTAL;<a name="line.699"></a>
+<span class="sourceLineNo">700</span> BackupInfo.Filter stateFilter = info -> 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<BackupInfo> 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<String> missingIds = new ArrayList<>();<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments,
- <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> region)</code> </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> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>>></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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> clusterState)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>>></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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments,
- <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> region)</code> </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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> regionMap,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> serverMap)</code> </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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> regionMap,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> serverMap)</code> </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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>></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><<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>> regions)</code> </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><<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> notClearedServers)</code> </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><<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> notClearedServers)</code> </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> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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><<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="i
nterface in org.apache.hadoop.hbase.client">RegionInfo</a>>>> clusterLoad)</code> </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> sysTable)</code> </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> conn,
<a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a> sysTable)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</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#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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)</code> </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> hri)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments,
- <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> region)</code> </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><<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>> ctx,
<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> desc,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[] regions)</code> </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><<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>> ctx,
<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> desc,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[] regions)</code> </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> 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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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> regionInfo)</code> </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> regionInfo,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> sn)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> clusterState)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</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#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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments,
- <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> region)</code> </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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> regionMap,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> serverMap)</code> </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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> regionMap,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> serverMap)</code> </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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>></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><<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>> regions)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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>> 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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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><<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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.ht
ml" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>>> clusterLoad)</code> </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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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> 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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> clusterState)</code> </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><<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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</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#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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)</code> </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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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<Pair<TableName, Path>> processedTableList = new ArrayList<>();<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 < 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<>(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<TableName> 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<TableName, Path> 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<String> 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 && 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<TableName> 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<Pair<TableName, Path>> processedTableList = new ArrayList<>();<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 < 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<>(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<TableName> 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<TableName, Path> 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<String> 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 && 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<TableName> 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() < 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() < 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<RegionPlan> balanceCluster(TableName tableName, Map<ServerName, List<RegionInfo>><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<RegionPlan> balanceCluster(Map<ServerName, List<RegionInfo>> 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<ServerName,List<RegionInfo>> correctedState = correctAssignments(clusterState);<a name="line.121"></a>
-<span class="sourceLineNo">122</span> List<RegionPlan> regionPlans = new ArrayList<>();<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span> List<RegionInfo> 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<RSGroupInfo> 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<ServerName, List<RegionInfo>> groupClusterState = new HashMap<>();<a name="line.132"></a>
-<span class="sourceLineNo">133</span> Map<TableName, Map<ServerName, List<RegionInfo>>> groupClusterLoad = new HashMap<>();<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<RegionPlan> 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<RegionPlan> balanceCluster(TableName tableName, Map<ServerName, List<RegionInfo>><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<RegionPlan> balanceCluster(Map<ServerName, List<RegionInfo>> 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<Map<ServerName,List<RegionInfo>>, List<RegionPlan>> correctedStateAndRegionPlans =<a name="line.123"></a>
+<span class="sourceLineNo">124</span> correctAssignments(clusterState);<a name="line.124"></a>
+<span class="sourceLineNo">125</span> Map<ServerName,List<RegionInfo>> correctedState = correctedStateAndRegionPlans.getFirst();<a name="line.125"></a>
+<span class="sourceLineNo">126</span> List<RegionPlan> 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<RSGroupInfo> 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<ServerName, List<RegionInfo>> groupClusterState = new HashMap<>();<a name="line.134"></a>
+<span class="sourceLineNo">135</span> Map<TableName, Map<ServerName, List<RegionInfo>>> groupClusterLoad = new HashMap<>();<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<RegionPlan> 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<ServerName, List<RegionInfo>> roundRobinAssignment(<a name="line.157"></a>
-<span class="sourceLineNo">158</span> List<RegionInfo> regions, List<ServerName> servers) throws HBaseIOException {<a name="line.158"></a>
-<span class="sourceLineNo">159</span> Map<ServerName, List<RegionInfo>> assignments = Maps.newHashMap();<a name="line.159"></a>
-<span class="sourceLineNo">160</span> ListMultimap<String,RegionInfo> regionMap = ArrayListMultimap.create();<a name="line.160"></a>
-<span class="sourceLineNo">161</span> ListMultimap<String,ServerName> 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() > 0) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span> Map<ServerName, List<RegionInfo>> 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) &&<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<ServerName, List<RegionInfo>> retainAssignment(<a name="line.184"></a>
-<span class="sourceLineNo">185</span> Map<RegionInfo, ServerName> regions, List<ServerName> 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<ServerName, List<RegionInfo>> assignments = new TreeMap<>();<a name="line.187"></a>
-<span class="sourceLineNo">188</span> ListMultimap<String, RegionInfo> groupToRegion = ArrayListMultimap.create();<a name="line.188"></a>
-<span class="sourceLineNo">189</span> Set<RegionInfo> 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<RegionInfo, ServerName> currentAssignmentMap = new TreeMap<RegionInfo, ServerName>();<a name="line.199"></a>
-<span class="sourceLineNo">200</span> List<RegionInfo> 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<ServerName> 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() > 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<ServerName, List<RegionInfo>> roundRobinAssignment(<a name="line.161"></a>
+<span class="sourceLineNo">162</span> List<RegionInfo> regions, List<ServerName> servers) throws HBaseIOException {<a name="line.162"></a>
+<span class="sourceLineNo">163</span> Map<ServerName, List<RegionInfo>> assignments = Maps.newHashMap();<a name="line.163"></a>
+<span class="sourceLineNo">164</span> ListMultimap<String,RegionInfo> regionMap = ArrayListMultimap.create();<a name="line.164"></a>
+<span class="sourceLineNo">165</span> ListMultimap<String,ServerName> 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() > 0) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span> Map<ServerName, List<RegionInfo>> 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) &&<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<ServerName, List<RegionInfo>> retainAssignment(<a name="line.188"></a>
+<span class="sourceLineNo">189</span> Map<RegionInfo, ServerName> regions, List<ServerName> 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<ServerName, List<RegionInfo>> assignments = new TreeMap<>();<a name="line.191"></a>
+<span class="sourceLineNo">192</span> ListMultimap<String, RegionInfo> groupToRegion = ArrayListMultimap.create();<a name="line.192"></a>
+<span class="sourceLineNo">193</span> Set<RegionInfo> 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<RegionInfo, ServerName> currentAssignmentMap = new TreeMap<RegionInfo, ServerName>();<a name="line.203"></a>
+<span class="sourceLineNo">204</span> List<RegionInfo> 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<ServerName> 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<ServerName> 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<>());<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<>());<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<ServerName> servers) throws HBaseIOException {<a name="line.239"></a>
-<span class="sourceLineNo">240</span> ListMultimap<String,RegionInfo> regionMap = LinkedListMultimap.create();<a name="line.240"></a>
-<span class="sourceLineNo">241</span> ListMultimap<String,ServerName> 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<ServerName> 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<RegionInfo> regions,<a name="line.248"></a>
-<span class="sourceLineNo">249</span> List<ServerName> servers,<a name="line.249"></a>
-<span class="sourceLineNo">250</span> ListMultimap<String, RegionInfo> regionMap,<a name="line.250"></a>
-<span class="sourceLineNo">251</span> ListMultimap<String, ServerName> 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() < 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<ServerName> filterOfflineServers(RSGroupInfo RSGroupInfo,<a name="line.272"></a>
-<span class="sourceLineNo">273</span> List<ServerName> 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<ServerName> filterServers(Set<Address> servers,<a name="line.291"></a>
-<span class="sourceLineNo">292</span> List<ServerName> 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<ServerName> finalList = new ArrayList<>();<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<RegionInfo> getMisplacedRegions(<a name="line.309"></a>
-<span class="sourceLineNo">310</span> Map<RegionInfo, ServerName> regions) throws IOException {<a name="line.310"></a>
-<span class="sourceLineNo">311</span> Set<RegionInfo> misplacedRegions = new HashSet<>();<a name="line.311"></a>
-<span class="sourceLineNo">312</span> for(Map.Entry<RegionInfo, ServerName> 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 && 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<ServerName, List<RegionInfo>> existingAssignments, RegionInfo region) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span> for (Map.Entry<ServerName, List<RegionInfo>> 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<ServerName, List<RegionInfo>> correctAssignments(<a name="line.349"></a>
-<span class="sourceLineNo">350</span> Map<ServerName, List<RegionInfo>> existingAssignments)<a name="line.350"></a>
-<span class="sourceLineNo">351</span> throws HBaseIOException{<a name="line.351"></a>
-<span class="sourceLineNo">352</span> Map<ServerName, List<RegionInfo>> correctAssignments = new TreeMap<>();<a name="line.352"></a>
-<span class="sourceLineNo">353</span> correctAssignments.put(LoadBalancer.BOGUS_SERVER_NAME, new LinkedList<>());<a name="line.353"></a>
-<span class="sourceLineNo">354</span> for (Map.Entry<ServerName, List<RegionInfo>> 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<>());<a name="line.356"></a>
-<span class="sourceLineNo">357</span> List<RegionInfo> 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() > 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<ServerName> 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<>());<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<>());<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<ServerName> servers) throws HBaseIOException {<a name="line.243"></a>
+<span class="sourceLineNo">244</span> ListMultimap<String,RegionInfo> regionMap = LinkedListMultimap.create();<a name="line.244"></a>
+<span class="sourceLineNo">245</span> ListMultimap<String,ServerName> 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<ServerName> 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<RegionInfo> regions,<a name="line.252"></a>
+<span class="sourceLineNo">253</span> List<ServerName> servers,<a name="line.253"></a>
+<span class="sourceLineNo">254</span> ListMultimap<String, RegionInfo> regionMap,<a name="line.254"></a>
+<span class="sourceLineNo">255</span> ListMultimap<String, ServerName> 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() < 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<ServerName> filterOfflineServers(RSGroupInfo RSGroupInfo,<a name="line.276"></a>
+<span class="sourceLineNo">277</span> List<ServerName> 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<ServerName> filterServers(Set<Address> servers,<a name="line.295"></a>
+<span class="sourceLineNo">296</span> List<ServerName> 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<ServerName> finalList = new ArrayList<>();<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<RegionInfo> getMisplacedRegions(<a name="line.313"></a>
+<span class="sourceLineNo">314</span> Map<RegionInfo, ServerName> regions) throws IOException {<a name="line.314"></a>
+<span class="sourceLineNo">315</span> Set<RegionInfo> misplacedRegions = new HashSet<>();<a name="line.315"></a>
+<span class="sourceLineNo">316</span> for(Map.Entry<RegionInfo, ServerName> 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 && 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<Map<ServerName, List<RegionInfo>>, List<RegionPlan>> correctAssignments(<a name="line.341"></a>
+<span class="sourceLineNo">342</span> Map<ServerName, List<RegionInfo>> 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<ServerName, List<RegionInfo>> correctAssignments = new TreeMap<>();<a name="line.345"></a>
+<span class="sourceLineNo">346</span> List<RegionPlan> regionPlansForMisplacedRegions = new ArrayList<>();<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span> for (Map.Entry<ServerName, List<RegionInfo>> 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<>());<a name="line.350"></a>
+<span class="sourceLineNo">351</span> List<RegionInfo> 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<RSGroupAdminEndpoint> 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<? extends LoadBalancer> 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<TableName, Map<ServerName, List<RegionInfo>>> 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<Map<ServerName, List<RegionInfo>>, List<RegionPlan>>(<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<RSGroupAdminEndpoint> 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<? extends LoadBalancer> 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<TableName, Map<ServerName, List<RegionInfo>>> 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 –
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 – 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 – 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 – 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 – 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 – 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All 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 © 2007–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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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><E> (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><T>, 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> </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> </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> </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> </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> </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> </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> </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> </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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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<TableName> 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>>></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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments,
- <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> region)</code> </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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> regionMap,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> serverMap)</code> </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> </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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>></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><<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>> regions)</code> </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> </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> </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 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> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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> 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> regionInfo,
<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> 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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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><<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&g
t;>> 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> 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 conf)</code> </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> 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> rsGroupInfoManager)</code> </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> 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 org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.73">LOG</a></pre>
+<pre>private static final 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 org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.75">config</a></pre>
+<pre>private 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 <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 <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 <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 <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 <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 <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 <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 <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.85">RSGroupBasedLoadBalancer</a>()</pre>
+public <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>getConf</h4>
-<pre>public org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.88">getConf</a>()</pre>
+<pre>public org.apache.hadoop.conf.Configuration <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> in interface <code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -483,7 +478,7 @@ public <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>setConf</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.93">setConf</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.94">setConf</a>(org.apache.hadoop.conf.Configuration conf)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>setConf</code> in interface <code>org.apache.hadoop.conf.Configurable</code></dd>
@@ -496,7 +491,7 @@ public <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>setClusterMetrics</h4>
-<pre>public void <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> sm)</pre>
+<pre>public void <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> sm)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>setMasterServices</h4>
-<pre>public void <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> masterServices)</pre>
+<pre>public void <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> masterServices)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>balanceCluster</h4>
-<pre>public <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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>> <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> tableName,
+<pre>public <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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>> <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> 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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> 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: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>balanceCluster</h4>
-<pre>public <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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>> <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> clusterState)
+<pre>public <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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>> <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> 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: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>roundRobinAssignment</h4>
-<pre>public <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> regions,
+<pre>public <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>retainAssignment</h4>
-<pre>public <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <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><<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>> regions,
+<pre>public <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <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><<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>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>randomAssignment</h4>
-<pre>public <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <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> region,
+<pre>public <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <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> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>generateGroupMaps</h4>
-<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> regions,
+<pre>private void <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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> regionMap,
org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap<<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>> serverMap)
@@ -649,7 +644,7 @@ public <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>filterOfflineServers</h4>
-<pre>private <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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> <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> RSGroupInfo,
+<pre>private <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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> <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> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> onlineServers)</pre>
</li>
</ul>
@@ -659,7 +654,7 @@ public <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>filterServers</h4>
-<pre>private <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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> <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><<a href="../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>> servers,
+<pre>private <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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> <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><<a href="../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>> 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><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> onlineServers)</pre>
<div class="block">Filter servers based on the online servers.</div>
<dl>
@@ -677,7 +672,7 @@ public <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>getMisplacedRegions</h4>
-<pre>public <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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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><<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>> regions)
+<pre>public <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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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><<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>> 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 <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 <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments,
- <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> region)</pre>
-</li>
-</ul>
<a name="correctAssignments-java.util.Map-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>correctAssignments</h4>
-<pre>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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)
- throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
+<pre>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>>> <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> 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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>initialize</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.378">initialize</a>()
+<pre>public void <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: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>isOnline</h4>
-<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.410">isOnline</a>()</pre>
+<pre>public boolean <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>setClusterLoad</h4>
-<pre>public void <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><<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>>> clusterLoad)</pre>
+<pre>public void <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><<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>>> clusterLoad)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>regionOnline</h4>
-<pre>public void <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> regionInfo,
+<pre>public void <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> regionInfo,
<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> sn)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>regionOffline</h4>
-<pre>public void <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> regionInfo)</pre>
+<pre>public void <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> regionInfo)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>onConfigurationChange</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.431">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.429">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration conf)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>stop</h4>
-<pre>public void <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> why)</pre>
+<pre>public void <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> why)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockList">
<li class="blockList">
<h4>isStopped</h4>
-<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.html#line.440">isStopped</a>()</pre>
+<pre>public boolean <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> in interface <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 <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSG
<ul class="blockListLast">
<li class="blockList">
<h4>setRsGroupInfoManager</h4>
-<pre>public void <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> rsGroupInfoManager)</pre>
+<pre>public void <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> 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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"> </span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd"> </span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd"> </span></span></caption>
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd"> </span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd"> </span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd"> </span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd"> </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 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> 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>[] backupIds)</code> </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> </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> </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> conn,
<a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a> sysTable)</code> </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> conn,
<a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a> sysTable)</code> </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 void <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> conn,
- <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a> 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 void <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> conn,
+ <a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a> 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#line.705">checkRemoveBackupImages</a>(org.apache.hadoop.fs.FileSystem 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> 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>[] 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.RepairCommand.html#line.688">printUsage</a>()</pre>
+<pre>protected void <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> in class <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 </code></td>
+<td class="colFirst"><code>static class </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> </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> </td>
</tr>
<tr class="rowColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="altColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="rowColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="altColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="rowColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="altColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="rowColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </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 </code></td>
+<td class="colFirst"><code>static class </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> </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> </td>
</tr>
<tr class="altColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="rowColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="altColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="rowColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="altColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="rowColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </td>
</tr>
<tr class="altColor">
-<td class="colFirst"><code>private static class </code></td>
+<td class="colFirst"><code>static class </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> </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> sysTable)</code> </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> conn,
<a href="../../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a> sysTable)</code> </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><org.apache.hadoop.fs.Path> pathList)</code> </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 p,
+ org.apache.hadoop.fs.Path 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 fs,
+ org.apache.hadoop.fs.Path p,
+ org.apache.hadoop.fs.Path 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 fs,
+ org.apache.hadoop.fs.Path tmpBackupDir,
+ org.apache.hadoop.fs.Path 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><<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>> backupIds,
<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> conn,
org.apache.hadoop.fs.FileSystem 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> backupRoot)</code> </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 fs,
- org.apache.hadoop.fs.Path 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 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> backupRoot,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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>[] backupIds)</code> </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>[] backupIds)</code> </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><<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#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>[] 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> mergedBackupId)</code> </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> </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>[] backupIds)</code> </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 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> 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> 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> mergedBackupId)</code> </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>[] 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 conf)</code> </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><org.apache.hadoop.fs.Path></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><<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path>> processedTableList)</code> </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><<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#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><<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path>> processedTableList)</code> </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> 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> 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.212">copyMetaData</a>(org.apache.hadoop.fs.FileSystem fs,
+ org.apache.hadoop.fs.Path tmpBackupDir,
+ org.apache.hadoop.fs.Path 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.242">copyFile</a>(org.apache.hadoop.fs.FileSystem fs,
+ org.apache.hadoop.fs.Path p,
+ org.apache.hadoop.fs.Path 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 org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.259">convertToDest</a>(org.apache.hadoop.fs.Path p,
+ org.apache.hadoop.fs.Path 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 <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><org.apache.hadoop.fs.Path> <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><<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path>> processedTableList)</pre>
+<pre>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><org.apache.hadoop.fs.Path> <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><<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path>> 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 <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><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>> <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><<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path>> processedTableList)</pre>
+<pre>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><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>> <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><<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,org.apache.hadoop.fs.Path>> 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.202">cleanupBulkLoadDirs</a>(org.apache.hadoop.fs.FileSystem fs,
+<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.295">cleanupBulkLoadDirs</a>(org.apache.hadoop.fs.FileSystem 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><org.apache.hadoop.fs.Path> 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 void <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> backupRoot,
+<pre>protected void <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> 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> 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><<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>> 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 void <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><<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>> backupIds,
+<pre>protected void <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><<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>> backupIds,
<a href="../../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> conn,
org.apache.hadoop.fs.FileSystem 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> 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 <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><<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/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>[] backupIds,
+<pre>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><<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/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>[] 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> 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.249">moveData</a>(org.apache.hadoop.fs.FileSystem fs,
+<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.342">moveData</a>(org.apache.hadoop.fs.FileSystem 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> backupRoot,
org.apache.hadoop.fs.Path bulkOutputPath,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.282">deleteData</a>(org.apache.hadoop.fs.FileSystem fs,
- org.apache.hadoop.fs.Path 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 <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/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>[] backupIds)</pre>
-</li>
-</ul>
<a name="getTableNamesInBackupImages-java.lang.String:A-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getTableNamesInBackupImages</h4>
-<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[] <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>[] backupIds)
+<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[] <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>[] 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 org.apache.hadoop.fs.Path[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.334">findInputDirectories</a>(org.apache.hadoop.fs.FileSystem fs,
+<pre>protected org.apache.hadoop.fs.Path[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/mapreduce/MapReduceBackupMergeJob.html#line.381">findInputDirectories</a>(org.apache.hadoop.fs.FileSystem 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> backupRoot,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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>[] 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><E> (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><T>, 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 result)</code> </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>[] backupIds)</code> </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> tableName,
org.apache.hadoop.conf.Configuration conf)</code> </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> tableName,
org.apache.hadoop.conf.Configuration conf,
boolean deleteOnExit)</code> </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 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> table)</code> </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><<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#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 fs,
org.apache.hadoop.fs.Path 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><<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>> files,
org.apache.hadoop.fs.PathFilter filter)</code> </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 fs,
org.apache.hadoop.fs.Path 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><<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#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 conf,
int n,
org.apache.hadoop.fs.Path backupRootPath,
<a href="../../../../../../org/apache/hadoop/hbase/backup/BackupInfo.Filter.html" title="interface in org.apache.hadoop.hbase.backup">BackupInfo.Filter</a>... filters)</code> </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><<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#getHistory-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.Path-">getHistory</a></span>(org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.fs.Path backupRootPath)</code> </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> 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> 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 <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></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><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>> 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 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><<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>></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><<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><<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>>> 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> 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> 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 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> 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><<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#getWALFilesOlderThan-org.apache.hadoop.conf.Configuration-java.util.HashMap-">getWALFilesOlderThan</a></span>(org.apache.hadoop.conf.Configuration 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><<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>> 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 fs,
org.apache.hadoop.fs.Path 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 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> backupId,
org.apache.hadoop.fs.FileSystem fs)</code> </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 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 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> tables)</code> </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><<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#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><<a href="../../../../../../org/apache/hadoop/hbase/backup/BackupInfo.html" title="class in org.apache.hadoop.hbase.backup">BackupInfo</a>> 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 result)</code> </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><<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>> backupManifestMap,
org.apache.hadoop.conf.Configuration conf)</code> </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 conf,
org.apache.hadoop.fs.FileSystem 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 <a href="../../../../../../org/apache/hadoop/hbase/tool/LoadIncrementalHFiles.html" title="class in org.apache.hadoop.hbase.tool">LoadIncrementalHFiles</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/util/BackupUtils.html#line.723">createLoader</a>(org.apache.hadoop.conf.Configuration 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 <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/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>[] 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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> clusterState)</code> </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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>></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><<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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</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><<a href="../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>>></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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>>> existingAssignments)</code> </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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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<TableName, Path> 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<String> 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<Path> toPathList(List<Pair<TableName, Path>> processedTableList) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span> ArrayList<Path> list = new ArrayList<>();<a name="line.187"></a>
-<span class="sourceLineNo">188</span> for (Pair<TableName, Path> 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<TableName> toTableNameList(List<Pair<TableName, Path>> processedTableList) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span> ArrayList<TableName> list = new ArrayList<>();<a name="line.195"></a>
-<span class="sourceLineNo">196</span> for (Pair<TableName, Path> 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<Path> 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<String> 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<String> 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<String> getBackupIdsToDelete(String[] backupIds, String mergedBackupId) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span> List<String> list = new ArrayList<>();<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<TableName, Path> 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<String> 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<LocatedFileStatus> it = fs.listFiles(tmpBackupDir, true);<a name="line.214"></a>
+<span class="sourceLineNo">215</span> List<Path> toKeep = new ArrayList<Path>();<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) > 0<a name="line.223"></a>
+<span class="sourceLineNo">224</span> || fileName.indexOf(HRegionFileSystem.REGION_INFO_FILE) > 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<String> stack = new Stack<String>();<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<LocatedFileStatus> it = fs.listFiles(dest, true);<a name="line.283"></a>
-<span class="sourceLineNo">284</span> List<Path> toDelete = new ArrayList<Path>();<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) > 0 ||<a name="line.292"></a>
-<span class="sourceLineNo">293</span> fileName.indexOf(HRegionFileSystem.REGION_INFO_FILE) > 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 > 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<TableName> allSet = new HashSet<>();<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<Path> toPathList(List<Pair<TableName, Path>> processedTableList) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span> ArrayList<Path> list = new ArrayList<>();<a name="line.280"></a>
+<span class="sourceLineNo">281</span> for (Pair<TableName, Path> 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<TableName> toTableNameList(List<Pair<TableName, Path>> processedTableList) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span> ArrayList<TableName> list = new ArrayList<>();<a name="line.288"></a>
+<span class="sourceLineNo">289</span> for (Pair<TableName, Path> 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<Path> 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<String> 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<String> 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<Path> dirs = new ArrayList<>();<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<String> getBackupIdsToDelete(String[] backupIds, String mergedBackupId) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span> List<String> list = new ArrayList<>();<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<TableName> allSet = new HashSet<>();<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<Path> dirs = new ArrayList<>();<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 > 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 –
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 –
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>©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 –
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 – 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 – 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 – 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 – 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 – 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 static final <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 static final <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 static final <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"> </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"> </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"> </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"> </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> </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> </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> </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> </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> </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<BytesWritable, NullWritable, NullWritable, NullWritable>.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> </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<R>, AsyncTable<AdvancedScanResultConsumer>, ColumnInterpreter<R, S, P, Q, T>, Scan, NavigableMap<byte[], S>)</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> </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> </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<ServerName, List<RegionInfo>>, 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> </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> </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> </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> </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> </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> </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> </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> </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> backupId)</code> </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> 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> 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> 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> 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> 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> 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> backupId)</code> </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 conf,
org.apache.hadoop.fs.Path 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> backupId)</code> </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 conf,
org.apache.hadoop.fs.Path 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> backupId)</code> </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> 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> backupId,
<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName)</code> </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> 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> 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> tableName,
org.apache.hadoop.fs.Path 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 org.apache.hadoop.fs.Path <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> 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 org.apache.hadoop.fs.Path <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> 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> 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 <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/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> backupRootDir,
+<pre>public 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> <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> 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> backupId,
<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 org.apache.hadoop.fs.Path <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> backupRootDir,
+<pre>public static org.apache.hadoop.fs.Path <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> 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> 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 org.apache.hadoop.fs.Path <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> tableName,
+<pre>public static org.apache.hadoop.fs.Path <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> tableName,
org.apache.hadoop.fs.Path 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> 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 <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/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> backupRootDir,
+<pre>public 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> <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> 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> 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 org.apache.hadoop.fs.Path <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> backupRootDir,
+<pre>public static org.apache.hadoop.fs.Path <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> 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> 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 org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.107">getManifestPath</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>private static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.126">getManifestPath</a>(org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.fs.Path 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> 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 <a href="../../../../../org/apache/hadoop/hbase/backup/impl/BackupManifest.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupManifest</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.124">getManifest</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>public static <a href="../../../../../org/apache/hadoop/hbase/backup/impl/BackupManifest.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupManifest</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/HBackupFileSystem.html#line.143">getManifest</a>(org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.fs.Path 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> 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 void <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><<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>> backupManifestMap,
+<pre>public static void <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><<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>> backupManifestMap,
<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[] tableArray,
org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.fs.Path 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 void <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>[] backupIds,
+<pre>private void <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>[] backupIds,
<a href="../../../../../../org/apache/hadoop/hbase/backup/impl/BackupSystemTable.html" title="class in org.apache.hadoop.hbase.backup.impl">BackupSystemTable</a> 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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.908">BackupSetCommand</a>(org.apache.hadoop.conf.Configuration conf,
org.apache.commons.cli.CommandLine 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.878">execute</a>()
+<pre>public void <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 void <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>[] args)
+<pre>private void <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>[] 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 void <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>[] args)
+<pre>private void <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>[] 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 void <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>[] args)
+<pre>private void <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>[] 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 void <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>[] args)
+<pre>private void <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>[] 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 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[] <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>[] tables)</pre>
+<pre>private <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[] <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>[] 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 void <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>[] args)
+<pre>private void <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>[] 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 <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup">BackupRestoreConstants.BackupCommand</a> <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> cmdStr)
+<pre>private <a href="../../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup">BackupRestoreConstants.BackupCommand</a> <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> 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.BackupSetCommand.html#line.1022">printUsage</a>()</pre>
+<pre>protected void <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> in class <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 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 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 conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.781">HistoryCommand</a>(org.apache.hadoop.conf.Configuration conf,
org.apache.commons.cli.CommandLine 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.751">execute</a>()
+<pre>public void <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 org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.795">getBackupRootPath</a>()
+<pre>private org.apache.hadoop.fs.Path <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 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.812">getTableName</a>()
+<pre>private <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <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 <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.HistoryCommand.html#line.828">getTableSetName</a>()</pre>
+<pre>private <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.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 int <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.832">parseHistoryLength</a>()
+<pre>private int <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.HistoryCommand.html#line.848">printUsage</a>()</pre>
+<pre>protected void <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> in class <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 conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.730">MergeCommand</a>(org.apache.hadoop.conf.Configuration conf,
org.apache.commons.cli.CommandLine 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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.700">requiresNoActiveSession</a>()</pre>
+<pre>protected boolean <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: <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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.705">requiresConsistentState</a>()</pre>
+<pre>protected boolean <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: <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.710">execute</a>()
+<pre>public void <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/backup/impl/BackupCommands.MergeCommand.html#line.737">printUsage</a>()</pre>
+<pre>protected void <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> in class <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 < 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<TableName> 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<BackupInfo> 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 < 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<TableName> 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<BackupInfo> 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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 < 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<BackupSet> 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<TableName> 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 < 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 < 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>