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

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

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

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

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

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

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

Reply via email to