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>