<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
<span class="sourceLineNo">017</span> */<a name="line.17"></a>
<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase;<a name="line.18"></a>
<span class="sourceLineNo">019</span><a name="line.19"></a>
<span class="sourceLineNo">020</span>import edu.umd.cs.findbugs.annotations.NonNull;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import edu.umd.cs.findbugs.annotations.Nullable;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.io.ByteArrayOutputStream;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.io.Closeable;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.Arrays;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.Collection;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.Collections;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.Iterator;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.util.LinkedHashMap;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.util.List;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.util.Map;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import java.util.NavigableMap;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import java.util.Set;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import java.util.SortedMap;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import java.util.regex.Matcher;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import java.util.regex.Pattern;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.hadoop.conf.Configuration;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.Cell.Type;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Get;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Put;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.48"></a>
<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.49"></a>
<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.50"></a>
<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.51"></a>
<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Result;<a name="line.52"></a>
<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.53"></a>
<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Table;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.TableState;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.coprocessor.Batch;<a name="line.57"></a>
<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.58"></a>
<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.59"></a>
<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;<a name="line.60"></a>
<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.filter.QualifierFilter;<a name="line.61"></a>
<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.filter.RegexStringComparator;<a name="line.62"></a>
<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.filter.RowFilter;<a name="line.63"></a>
<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.64"></a>
<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils;<a name="line.65"></a>
<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.ipc.ServerRpcController;<a name="line.66"></a>
<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.67"></a>
<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.master.RegionState.State;<a name="line.68"></a>
<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.69"></a>
<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;<a name="line.70"></a>
<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.protobuf.generated.MultiRowMutationProtos.MultiRowMutationService;<a name="line.71"></a>
<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.protobuf.generated.MultiRowMutationProtos.MutateRowsRequest;<a name="line.72"></a>
<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.protobuf.generated.MultiRowMutationProtos.MutateRowsResponse;<a name="line.73"></a>
<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.74"></a>
<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.75"></a>
<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.ExceptionUtil;<a name="line.76"></a>
<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.77"></a>
<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.PairOfSameType;<a name="line.78"></a>
<span class="sourceLineNo">079</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.79"></a>
<span class="sourceLineNo">080</span>import org.slf4j.Logger;<a name="line.80"></a>
<span class="sourceLineNo">081</span>import org.slf4j.LoggerFactory;<a name="line.81"></a>
<span class="sourceLineNo">082</span><a name="line.82"></a>
<span class="sourceLineNo">083</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.83"></a>
<span class="sourceLineNo">084</span>import org.apache.hbase.thirdparty.com.google.common.base.Throwables;<a name="line.84"></a>
<span class="sourceLineNo">085</span><a name="line.85"></a>
<span class="sourceLineNo">086</span>/**<a name="line.86"></a>
<span class="sourceLineNo">087</span> * &lt;p&gt;<a name="line.87"></a>
<span class="sourceLineNo">088</span> * Read/write operations on &lt;code&gt;hbase:meta&lt;/code&gt; region as well as assignment information stored<a name="line.88"></a>
<span class="sourceLineNo">089</span> * to &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.89"></a>
<span class="sourceLineNo">090</span> * &lt;/p&gt;<a name="line.90"></a>
<span class="sourceLineNo">091</span> * &lt;p&gt;<a name="line.91"></a>
<span class="sourceLineNo">092</span> * Some of the methods of this class take ZooKeeperWatcher as a param. The only reason for this is<a name="line.92"></a>
<span class="sourceLineNo">093</span> * when this class is used on client-side (e.g. HBaseAdmin), we want to use short-lived connection<a name="line.93"></a>
<span class="sourceLineNo">094</span> * (opened before each operation, closed right after), while when used on HM or HRS (like in<a name="line.94"></a>
<span class="sourceLineNo">095</span> * AssignmentManager) we want permanent connection.<a name="line.95"></a>
<span class="sourceLineNo">096</span> * &lt;/p&gt;<a name="line.96"></a>
<span class="sourceLineNo">097</span> * &lt;p&gt;<a name="line.97"></a>
<span class="sourceLineNo">098</span> * HBASE-10070 adds a replicaId to HRI, meaning more than one HRI can be defined for the same table<a name="line.98"></a>
<span class="sourceLineNo">099</span> * range (table, startKey, endKey). For every range, there will be at least one HRI defined which is<a name="line.99"></a>
<span class="sourceLineNo">100</span> * called default replica.<a name="line.100"></a>
<span class="sourceLineNo">101</span> * &lt;/p&gt;<a name="line.101"></a>
<span class="sourceLineNo">102</span> * &lt;p&gt;<a name="line.102"></a>
<span class="sourceLineNo">103</span> * &lt;h2&gt;Meta layout&lt;/h2&gt;<a name="line.103"></a>
<span class="sourceLineNo">104</span> *<a name="line.104"></a>
<span class="sourceLineNo">105</span> * &lt;pre&gt;<a name="line.105"></a>
<span class="sourceLineNo">106</span> * For each table there is single row named for the table with a 'table' column family.<a name="line.106"></a>
<span class="sourceLineNo">107</span> * The column family currently has one column in it, the 'state' column:<a name="line.107"></a>
<span class="sourceLineNo">108</span> *<a name="line.108"></a>
<span class="sourceLineNo">109</span> * table:state             =&gt; contains table state<a name="line.109"></a>
<span class="sourceLineNo">110</span> *<a name="line.110"></a>
<span class="sourceLineNo">111</span> * Then for each table range ('Region'), there is a single row, formatted as:<a name="line.111"></a>
<span class="sourceLineNo">112</span> * &amp;lt;tableName&amp;gt;,&amp;lt;startKey&amp;gt;,&amp;lt;regionId&amp;gt;,&amp;lt;encodedRegionName&amp;gt;.<a name="line.112"></a>
<span class="sourceLineNo">113</span> * This row is the serialized regionName of the default region replica.<a name="line.113"></a>
<span class="sourceLineNo">114</span> * Columns are:<a name="line.114"></a>
<span class="sourceLineNo">115</span> * info:regioninfo         =&gt; contains serialized HRI for the default region replica<a name="line.115"></a>
<span class="sourceLineNo">116</span> * info:server             =&gt; contains hostname:port (in string form) for the server hosting<a name="line.116"></a>
<span class="sourceLineNo">117</span> *                            the default regionInfo replica<a name="line.117"></a>
<span class="sourceLineNo">118</span> * info:server_&amp;lt;replicaId&amp;gt =&gt; contains hostname:port (in string form) for the server hosting<a name="line.118"></a>
<span class="sourceLineNo">119</span> *                                 the regionInfo replica with replicaId<a name="line.119"></a>
<span class="sourceLineNo">120</span> * info:serverstartcode    =&gt; contains server start code (in binary long form) for the server<a name="line.120"></a>
<span class="sourceLineNo">121</span> *                            hosting the default regionInfo replica<a name="line.121"></a>
<span class="sourceLineNo">122</span> * info:serverstartcode_&amp;lt;replicaId&amp;gt =&gt; contains server start code (in binary long form) for<a name="line.122"></a>
<span class="sourceLineNo">123</span> *                                          the server hosting the regionInfo replica with<a name="line.123"></a>
<span class="sourceLineNo">124</span> *                                          replicaId<a name="line.124"></a>
<span class="sourceLineNo">125</span> * info:seqnumDuringOpen   =&gt; contains seqNum (in binary long form) for the region at the time<a name="line.125"></a>
<span class="sourceLineNo">126</span> *                             the server opened the region with default replicaId<a name="line.126"></a>
<span class="sourceLineNo">127</span> * info:seqnumDuringOpen_&amp;lt;replicaId&amp;gt =&gt; contains seqNum (in binary long form) for the region<a name="line.127"></a>
<span class="sourceLineNo">128</span> *                                           at the time the server opened the region with<a name="line.128"></a>
<span class="sourceLineNo">129</span> *                                           replicaId<a name="line.129"></a>
<span class="sourceLineNo">130</span> * info:splitA             =&gt; contains a serialized HRI for the first daughter region if the<a name="line.130"></a>
<span class="sourceLineNo">131</span> *                             region is split<a name="line.131"></a>
<span class="sourceLineNo">132</span> * info:splitB             =&gt; contains a serialized HRI for the second daughter region if the<a name="line.132"></a>
<span class="sourceLineNo">133</span> *                             region is split<a name="line.133"></a>
<span class="sourceLineNo">134</span> * info:merge*             =&gt; contains a serialized HRI for a merge parent region. There will be two<a name="line.134"></a>
<span class="sourceLineNo">135</span> *                             or more of these columns in a row. A row that has these columns is<a name="line.135"></a>
<span class="sourceLineNo">136</span> *                             undergoing a merge and is the result of the merge. Columns listed<a name="line.136"></a>
<span class="sourceLineNo">137</span> *                             in marge* columns are the parents of this merged region. Example<a name="line.137"></a>
<span class="sourceLineNo">138</span> *                             columns: info:merge0001, info:merge0002. You make also see 'mergeA',<a name="line.138"></a>
<span class="sourceLineNo">139</span> *                             and 'mergeB'. This is old form replaced by the new format that allows<a name="line.139"></a>
<span class="sourceLineNo">140</span> *                             for more than two parents to be merged at a time.<a name="line.140"></a>
<span class="sourceLineNo">141</span> * TODO: Add rep_barrier for serial replication explaination.<a name="line.141"></a>
<span class="sourceLineNo">142</span> * &lt;/pre&gt;<a name="line.142"></a>
<span class="sourceLineNo">143</span> * &lt;/p&gt;<a name="line.143"></a>
<span class="sourceLineNo">144</span> * &lt;p&gt;<a name="line.144"></a>
<span class="sourceLineNo">145</span> * The actual layout of meta should be encapsulated inside MetaTableAccessor methods, and should not<a name="line.145"></a>
<span class="sourceLineNo">146</span> * leak out of it (through Result objects, etc)<a name="line.146"></a>
<span class="sourceLineNo">147</span> * &lt;/p&gt;<a name="line.147"></a>
<span class="sourceLineNo">148</span> */<a name="line.148"></a>
<span class="sourceLineNo">149</span>@InterfaceAudience.Private<a name="line.149"></a>
<span class="sourceLineNo">150</span>public class MetaTableAccessor {<a name="line.150"></a>
<span class="sourceLineNo">151</span><a name="line.151"></a>
<span class="sourceLineNo">152</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.152"></a>
<span class="sourceLineNo">153</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.153"></a>
<span class="sourceLineNo">154</span><a name="line.154"></a>
<span class="sourceLineNo">155</span>  @VisibleForTesting<a name="line.155"></a>
<span class="sourceLineNo">156</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.156"></a>
<span class="sourceLineNo">157</span><a name="line.157"></a>
<span class="sourceLineNo">158</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.158"></a>
<span class="sourceLineNo">159</span><a name="line.159"></a>
<span class="sourceLineNo">160</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.160"></a>
<span class="sourceLineNo">161</span><a name="line.161"></a>
<span class="sourceLineNo">162</span>  @InterfaceAudience.Private<a name="line.162"></a>
<span class="sourceLineNo">163</span>  public enum QueryType {<a name="line.163"></a>
<span class="sourceLineNo">164</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.164"></a>
<span class="sourceLineNo">165</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.165"></a>
<span class="sourceLineNo">166</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.166"></a>
<span class="sourceLineNo">167</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.167"></a>
<span class="sourceLineNo">168</span><a name="line.168"></a>
<span class="sourceLineNo">169</span>    private final byte[][] families;<a name="line.169"></a>
<span class="sourceLineNo">170</span><a name="line.170"></a>
<span class="sourceLineNo">171</span>    QueryType(byte[]... families) {<a name="line.171"></a>
<span class="sourceLineNo">172</span>      this.families = families;<a name="line.172"></a>
<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
<span class="sourceLineNo">174</span><a name="line.174"></a>
<span class="sourceLineNo">175</span>    byte[][] getFamilies() {<a name="line.175"></a>
<span class="sourceLineNo">176</span>      return this.families;<a name="line.176"></a>
<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
<span class="sourceLineNo">179</span><a name="line.179"></a>
<span class="sourceLineNo">180</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.180"></a>
<span class="sourceLineNo">181</span>  static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.181"></a>
<span class="sourceLineNo">182</span><a name="line.182"></a>
<span class="sourceLineNo">183</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.183"></a>
<span class="sourceLineNo">184</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.184"></a>
<span class="sourceLineNo">185</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.185"></a>
<span class="sourceLineNo">186</span><a name="line.186"></a>
<span class="sourceLineNo">187</span>  ////////////////////////<a name="line.187"></a>
<span class="sourceLineNo">188</span>  // Reading operations //<a name="line.188"></a>
<span class="sourceLineNo">189</span>  ////////////////////////<a name="line.189"></a>
<span class="sourceLineNo">190</span><a name="line.190"></a>
<span class="sourceLineNo">191</span>  /**<a name="line.191"></a>
<span class="sourceLineNo">192</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.192"></a>
<span class="sourceLineNo">193</span>   * @param connection connection we're using<a name="line.193"></a>
<span class="sourceLineNo">194</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.194"></a>
<span class="sourceLineNo">195</span>   */<a name="line.195"></a>
<span class="sourceLineNo">196</span>  public static void fullScanRegions(Connection connection, final Visitor visitor)<a name="line.196"></a>
<span class="sourceLineNo">197</span>      throws IOException {<a name="line.197"></a>
<span class="sourceLineNo">198</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.198"></a>
<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
<span class="sourceLineNo">200</span><a name="line.200"></a>
<span class="sourceLineNo">201</span>  /**<a name="line.201"></a>
<span class="sourceLineNo">202</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.202"></a>
<span class="sourceLineNo">203</span>   * @param connection connection we're using<a name="line.203"></a>
<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
<span class="sourceLineNo">205</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection) throws IOException {<a name="line.205"></a>
<span class="sourceLineNo">206</span>    return fullScan(connection, QueryType.REGION);<a name="line.206"></a>
<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
<span class="sourceLineNo">208</span><a name="line.208"></a>
<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
<span class="sourceLineNo">210</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.210"></a>
<span class="sourceLineNo">211</span>   * @param connection connection we're using<a name="line.211"></a>
<span class="sourceLineNo">212</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.212"></a>
<span class="sourceLineNo">213</span>   */<a name="line.213"></a>
<span class="sourceLineNo">214</span>  public static void fullScanTables(Connection connection, final Visitor visitor)<a name="line.214"></a>
<span class="sourceLineNo">215</span>      throws IOException {<a name="line.215"></a>
<span class="sourceLineNo">216</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.216"></a>
<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
<span class="sourceLineNo">218</span><a name="line.218"></a>
<span class="sourceLineNo">219</span>  /**<a name="line.219"></a>
<span class="sourceLineNo">220</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.220"></a>
<span class="sourceLineNo">221</span>   * @param connection connection we're using<a name="line.221"></a>
<span class="sourceLineNo">222</span>   * @param type scanned part of meta<a name="line.222"></a>
<span class="sourceLineNo">223</span>   * @return List of {@link Result}<a name="line.223"></a>
<span class="sourceLineNo">224</span>   */<a name="line.224"></a>
<span class="sourceLineNo">225</span>  private static List&lt;Result&gt; fullScan(Connection connection, QueryType type) throws IOException {<a name="line.225"></a>
<span class="sourceLineNo">226</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.226"></a>
<span class="sourceLineNo">227</span>    scanMeta(connection, null, null, type, v);<a name="line.227"></a>
<span class="sourceLineNo">228</span>    return v.getResults();<a name="line.228"></a>
<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
<span class="sourceLineNo">230</span><a name="line.230"></a>
<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
<span class="sourceLineNo">232</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.232"></a>
<span class="sourceLineNo">233</span>   * @param connection connection we're using to access Meta<a name="line.233"></a>
<span class="sourceLineNo">234</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.234"></a>
<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
<span class="sourceLineNo">236</span>  public static Table getMetaHTable(final Connection connection)<a name="line.236"></a>
<span class="sourceLineNo">237</span>  throws IOException {<a name="line.237"></a>
<span class="sourceLineNo">238</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.238"></a>
<span class="sourceLineNo">239</span>    if (connection == null) {<a name="line.239"></a>
<span class="sourceLineNo">240</span>      throw new NullPointerException("No connection");<a name="line.240"></a>
<span class="sourceLineNo">241</span>    } else if (connection.isClosed()) {<a name="line.241"></a>
<span class="sourceLineNo">242</span>      throw new IOException("connection is closed");<a name="line.242"></a>
<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
<span class="sourceLineNo">244</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.244"></a>
<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
<span class="sourceLineNo">246</span><a name="line.246"></a>
<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
<span class="sourceLineNo">248</span>   * @param t Table to use (will be closed when done).<a name="line.248"></a>
<span class="sourceLineNo">249</span>   * @param g Get to run<a name="line.249"></a>
<span class="sourceLineNo">250</span>   */<a name="line.250"></a>
<span class="sourceLineNo">251</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.251"></a>
<span class="sourceLineNo">252</span>    if (t == null) return null;<a name="line.252"></a>
<span class="sourceLineNo">253</span>    try {<a name="line.253"></a>
<span class="sourceLineNo">254</span>      return t.get(g);<a name="line.254"></a>
<span class="sourceLineNo">255</span>    } finally {<a name="line.255"></a>
<span class="sourceLineNo">256</span>      t.close();<a name="line.256"></a>
<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
<span class="sourceLineNo">259</span><a name="line.259"></a>
<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
<span class="sourceLineNo">261</span>   * Gets the region info and assignment for the specified region.<a name="line.261"></a>
<span class="sourceLineNo">262</span>   * @param connection connection we're using<a name="line.262"></a>
<span class="sourceLineNo">263</span>   * @param regionName Region to lookup.<a name="line.263"></a>
<span class="sourceLineNo">264</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.264"></a>
<span class="sourceLineNo">265</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.265"></a>
<span class="sourceLineNo">266</span>   */<a name="line.266"></a>
<span class="sourceLineNo">267</span>  @Deprecated<a name="line.267"></a>
<span class="sourceLineNo">268</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.268"></a>
<span class="sourceLineNo">269</span>    throws IOException {<a name="line.269"></a>
<span class="sourceLineNo">270</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.270"></a>
<span class="sourceLineNo">271</span>    return location == null<a name="line.271"></a>
<span class="sourceLineNo">272</span>      ? null<a name="line.272"></a>
<span class="sourceLineNo">273</span>      : new Pair&lt;&gt;(location.getRegion(), location.getServerName());<a name="line.273"></a>
<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
<span class="sourceLineNo">275</span><a name="line.275"></a>
<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
<span class="sourceLineNo">277</span>   * Returns the HRegionLocation from meta for the given region<a name="line.277"></a>
<span class="sourceLineNo">278</span>   * @param connection connection we're using<a name="line.278"></a>
<span class="sourceLineNo">279</span>   * @param regionName region we're looking for<a name="line.279"></a>
<span class="sourceLineNo">280</span>   * @return HRegionLocation for the given region<a name="line.280"></a>
<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
<span class="sourceLineNo">282</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.282"></a>
<span class="sourceLineNo">283</span>      throws IOException {<a name="line.283"></a>
<span class="sourceLineNo">284</span>    byte[] row = regionName;<a name="line.284"></a>
<span class="sourceLineNo">285</span>    RegionInfo parsedInfo = null;<a name="line.285"></a>
<span class="sourceLineNo">286</span>    try {<a name="line.286"></a>
<span class="sourceLineNo">287</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.287"></a>
<span class="sourceLineNo">288</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.288"></a>
<span class="sourceLineNo">289</span>    } catch (Exception parseEx) {<a name="line.289"></a>
<span class="sourceLineNo">290</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.290"></a>
<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
<span class="sourceLineNo">292</span>    Get get = new Get(row);<a name="line.292"></a>
<span class="sourceLineNo">293</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.293"></a>
<span class="sourceLineNo">294</span>    Result r = get(getMetaHTable(connection), get);<a name="line.294"></a>
<span class="sourceLineNo">295</span>    RegionLocations locations = getRegionLocations(r);<a name="line.295"></a>
<span class="sourceLineNo">296</span>    return locations == null ? null<a name="line.296"></a>
<span class="sourceLineNo">297</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.297"></a>
<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
<span class="sourceLineNo">299</span><a name="line.299"></a>
<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
<span class="sourceLineNo">301</span>   * Returns the HRegionLocation from meta for the given region<a name="line.301"></a>
<span class="sourceLineNo">302</span>   * @param connection connection we're using<a name="line.302"></a>
<span class="sourceLineNo">303</span>   * @param regionInfo region information<a name="line.303"></a>
<span class="sourceLineNo">304</span>   * @return HRegionLocation for the given region<a name="line.304"></a>
<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
<span class="sourceLineNo">306</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.306"></a>
<span class="sourceLineNo">307</span>      throws IOException {<a name="line.307"></a>
<span class="sourceLineNo">308</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.308"></a>
<span class="sourceLineNo">309</span>    Get get = new Get(row);<a name="line.309"></a>
<span class="sourceLineNo">310</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.310"></a>
<span class="sourceLineNo">311</span>    Result r = get(getMetaHTable(connection), get);<a name="line.311"></a>
<span class="sourceLineNo">312</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.312"></a>
<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
<span class="sourceLineNo">314</span><a name="line.314"></a>
<span class="sourceLineNo">315</span>  /** Returns the row key to use for this regionInfo */<a name="line.315"></a>
<span class="sourceLineNo">316</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.316"></a>
<span class="sourceLineNo">317</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.317"></a>
<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
<span class="sourceLineNo">319</span><a name="line.319"></a>
<span class="sourceLineNo">320</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.320"></a>
<span class="sourceLineNo">321</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.321"></a>
<span class="sourceLineNo">322</span>   * in the regionName.<a name="line.322"></a>
<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
<span class="sourceLineNo">324</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.324"></a>
<span class="sourceLineNo">325</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.325"></a>
<span class="sourceLineNo">326</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.326"></a>
<span class="sourceLineNo">327</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.327"></a>
<span class="sourceLineNo">328</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.328"></a>
<span class="sourceLineNo">329</span>              .setStartKey(fields[1])<a name="line.329"></a>
<span class="sourceLineNo">330</span>              .setEndKey(fields[2])<a name="line.330"></a>
<span class="sourceLineNo">331</span>              .setSplit(false)<a name="line.331"></a>
<span class="sourceLineNo">332</span>              .setRegionId(regionId)<a name="line.332"></a>
<span class="sourceLineNo">333</span>              .setReplicaId(replicaId)<a name="line.333"></a>
<span class="sourceLineNo">334</span>              .build();<a name="line.334"></a>
<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
<span class="sourceLineNo">336</span><a name="line.336"></a>
<span class="sourceLineNo">337</span>  /**<a name="line.337"></a>
<span class="sourceLineNo">338</span>   * Gets the result in hbase:meta for the specified region.<a name="line.338"></a>
<span class="sourceLineNo">339</span>   * @param connection connection we're using<a name="line.339"></a>
<span class="sourceLineNo">340</span>   * @param regionName region we're looking for<a name="line.340"></a>
<span class="sourceLineNo">341</span>   * @return result of the specified region<a name="line.341"></a>
<span class="sourceLineNo">342</span>   */<a name="line.342"></a>
<span class="sourceLineNo">343</span>  public static Result getRegionResult(Connection connection,<a name="line.343"></a>
<span class="sourceLineNo">344</span>      byte[] regionName) throws IOException {<a name="line.344"></a>
<span class="sourceLineNo">345</span>    Get get = new Get(regionName);<a name="line.345"></a>
<span class="sourceLineNo">346</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.346"></a>
<span class="sourceLineNo">347</span>    return get(getMetaHTable(connection), get);<a name="line.347"></a>
<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
<span class="sourceLineNo">349</span><a name="line.349"></a>
<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
<span class="sourceLineNo">351</span>   * Scans META table for a row whose key contains the specified &lt;B&gt;regionEncodedName&lt;/B&gt;,<a name="line.351"></a>
<span class="sourceLineNo">352</span>   * returning a single related &lt;code&gt;Result&lt;/code&gt; instance if any row is found, null otherwise.<a name="line.352"></a>
<span class="sourceLineNo">353</span>   *<a name="line.353"></a>
<span class="sourceLineNo">354</span>   * @param connection the connection to query META table.<a name="line.354"></a>
<span class="sourceLineNo">355</span>   * @param regionEncodedName the region encoded name to look for at META.<a name="line.355"></a>
<span class="sourceLineNo">356</span>   * @return &lt;code&gt;Result&lt;/code&gt; instance with the row related info in META, null otherwise.<a name="line.356"></a>
<span class="sourceLineNo">357</span>   * @throws IOException if any errors occur while querying META.<a name="line.357"></a>
<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
<span class="sourceLineNo">359</span>  public static Result scanByRegionEncodedName(Connection connection,<a name="line.359"></a>
<span class="sourceLineNo">360</span>      String regionEncodedName) throws IOException {<a name="line.360"></a>
<span class="sourceLineNo">361</span>    RowFilter rowFilter = new RowFilter(CompareOperator.EQUAL,<a name="line.361"></a>
<span class="sourceLineNo">362</span>      new SubstringComparator(regionEncodedName));<a name="line.362"></a>
<span class="sourceLineNo">363</span>    Scan scan = getMetaScan(connection, 1);<a name="line.363"></a>
<span class="sourceLineNo">364</span>    scan.setFilter(rowFilter);<a name="line.364"></a>
<span class="sourceLineNo">365</span>    ResultScanner resultScanner = getMetaHTable(connection).getScanner(scan);<a name="line.365"></a>
<span class="sourceLineNo">366</span>    return resultScanner.next();<a name="line.366"></a>
<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
<span class="sourceLineNo">368</span><a name="line.368"></a>
<span class="sourceLineNo">369</span>  /**<a name="line.369"></a>
<span class="sourceLineNo">370</span>   * @return Return all regioninfos listed in the 'info:merge*' columns of<a name="line.370"></a>
<span class="sourceLineNo">371</span>   *   the &lt;code&gt;regionName&lt;/code&gt; row.<a name="line.371"></a>
<span class="sourceLineNo">372</span>   */<a name="line.372"></a>
<span class="sourceLineNo">373</span>  @Nullable<a name="line.373"></a>
<span class="sourceLineNo">374</span>  public static List&lt;RegionInfo&gt; getMergeRegions(Connection connection, byte[] regionName)<a name="line.374"></a>
<span class="sourceLineNo">375</span>      throws IOException {<a name="line.375"></a>
<span class="sourceLineNo">376</span>    return getMergeRegions(getMergeRegionsRaw(connection, regionName));<a name="line.376"></a>
<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
<span class="sourceLineNo">378</span><a name="line.378"></a>
<span class="sourceLineNo">379</span>  /**<a name="line.379"></a>
<span class="sourceLineNo">380</span>   * @return Deserialized regioninfo values taken from column values that match<a name="line.380"></a>
<span class="sourceLineNo">381</span>   *   the regex 'info:merge.*' in array of &lt;code&gt;cells&lt;/code&gt;.<a name="line.381"></a>
<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
<span class="sourceLineNo">383</span>  @Nullable<a name="line.383"></a>
<span class="sourceLineNo">384</span>  public static List&lt;RegionInfo&gt; getMergeRegions(Cell [] cells) {<a name="line.384"></a>
<span class="sourceLineNo">385</span>    if (cells == null) {<a name="line.385"></a>
<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
<span class="sourceLineNo">388</span>    List&lt;RegionInfo&gt; regionsToMerge = null;<a name="line.388"></a>
<span class="sourceLineNo">389</span>    for (Cell cell: cells) {<a name="line.389"></a>
<span class="sourceLineNo">390</span>      if (!isMergeQualifierPrefix(cell)) {<a name="line.390"></a>
<span class="sourceLineNo">391</span>        continue;<a name="line.391"></a>
<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
<span class="sourceLineNo">393</span>      // Ok. This cell is that of a info:merge* column.<a name="line.393"></a>
<span class="sourceLineNo">394</span>      RegionInfo ri = RegionInfo.parseFromOrNull(cell.getValueArray(), cell.getValueOffset(),<a name="line.394"></a>
<span class="sourceLineNo">395</span>         cell.getValueLength());<a name="line.395"></a>
<span class="sourceLineNo">396</span>      if (ri != null) {<a name="line.396"></a>
<span class="sourceLineNo">397</span>        if (regionsToMerge == null) {<a name="line.397"></a>
<span class="sourceLineNo">398</span>          regionsToMerge = new ArrayList&lt;&gt;();<a name="line.398"></a>
<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
<span class="sourceLineNo">400</span>        regionsToMerge.add(ri);<a name="line.400"></a>
<span class="sourceLineNo">401</span>      }<a name="line.401"></a>
<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
<span class="sourceLineNo">403</span>    return regionsToMerge;<a name="line.403"></a>
<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
<span class="sourceLineNo">405</span><a name="line.405"></a>
<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
<span class="sourceLineNo">407</span>   * @return True if any merge regions present in &lt;code&gt;cells&lt;/code&gt;; i.e.<a name="line.407"></a>
<span class="sourceLineNo">408</span>   *   the column in &lt;code&gt;cell&lt;/code&gt; matches the regex 'info:merge.*'.<a name="line.408"></a>
<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
<span class="sourceLineNo">410</span>  public static boolean hasMergeRegions(Cell [] cells) {<a name="line.410"></a>
<span class="sourceLineNo">411</span>    for (Cell cell: cells) {<a name="line.411"></a>
<span class="sourceLineNo">412</span>      if (!isMergeQualifierPrefix(cell)) {<a name="line.412"></a>
<span class="sourceLineNo">413</span>        continue;<a name="line.413"></a>
<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
<span class="sourceLineNo">415</span>      return true;<a name="line.415"></a>
<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
<span class="sourceLineNo">417</span>    return false;<a name="line.417"></a>
<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
<span class="sourceLineNo">419</span><a name="line.419"></a>
<span class="sourceLineNo">420</span>  /**<a name="line.420"></a>
<span class="sourceLineNo">421</span>   * @return True if the column in &lt;code&gt;cell&lt;/code&gt; matches the regex 'info:merge.*'.<a name="line.421"></a>
<span class="sourceLineNo">422</span>   */<a name="line.422"></a>
<span class="sourceLineNo">423</span>  private static boolean isMergeQualifierPrefix(Cell cell) {<a name="line.423"></a>
<span class="sourceLineNo">424</span>    // Check to see if has family and that qualifier starts with the merge qualifier 'merge'<a name="line.424"></a>
<span class="sourceLineNo">425</span>    return CellUtil.matchingFamily(cell, HConstants.CATALOG_FAMILY) &amp;&amp;<a name="line.425"></a>
<span class="sourceLineNo">426</span>      PrivateCellUtil.qualifierStartsWith(cell, HConstants.MERGE_QUALIFIER_PREFIX);<a name="line.426"></a>
<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
<span class="sourceLineNo">428</span><a name="line.428"></a>
<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
<span class="sourceLineNo">430</span>   * @return Array of Cells made from all columns on the &lt;code&gt;regionName&lt;/code&gt; row<a name="line.430"></a>
<span class="sourceLineNo">431</span>   *   that match the regex 'info:merge.*'.<a name="line.431"></a>
<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
<span class="sourceLineNo">433</span>  @Nullable<a name="line.433"></a>
<span class="sourceLineNo">434</span>  private static Cell [] getMergeRegionsRaw(Connection connection, byte [] regionName)<a name="line.434"></a>
<span class="sourceLineNo">435</span>      throws IOException {<a name="line.435"></a>
<span class="sourceLineNo">436</span>    Scan scan = new Scan().withStartRow(regionName).<a name="line.436"></a>
<span class="sourceLineNo">437</span>        setOneRowLimit().<a name="line.437"></a>
<span class="sourceLineNo">438</span>        readVersions(1).<a name="line.438"></a>
<span class="sourceLineNo">439</span>        addFamily(HConstants.CATALOG_FAMILY).<a name="line.439"></a>
<span class="sourceLineNo">440</span>        setFilter(new QualifierFilter(CompareOperator.EQUAL,<a name="line.440"></a>
<span class="sourceLineNo">441</span>          new RegexStringComparator(HConstants.MERGE_QUALIFIER_PREFIX_STR+ ".*")));<a name="line.441"></a>
<span class="sourceLineNo">442</span>    try (Table m = getMetaHTable(connection); ResultScanner scanner = m.getScanner(scan)) {<a name="line.442"></a>
<span class="sourceLineNo">443</span>      // Should be only one result in this scanner if any.<a name="line.443"></a>
<span class="sourceLineNo">444</span>      Result result = scanner.next();<a name="line.444"></a>
<span class="sourceLineNo">445</span>      if (result == null) {<a name="line.445"></a>
<span class="sourceLineNo">446</span>        return null;<a name="line.446"></a>
<span class="sourceLineNo">447</span>      }<a name="line.447"></a>
<span class="sourceLineNo">448</span>      // Should be safe to just return all Cells found since we had filter in place.<a name="line.448"></a>
<span class="sourceLineNo">449</span>      // All values should be RegionInfos or something wrong.<a name="line.449"></a>
<span class="sourceLineNo">450</span>      return result.rawCells();<a name="line.450"></a>
<span class="sourceLineNo">451</span>    }<a name="line.451"></a>
<span class="sourceLineNo">452</span>  }<a name="line.452"></a>
<span class="sourceLineNo">453</span><a name="line.453"></a>
<span class="sourceLineNo">454</span>  /**<a name="line.454"></a>
<span class="sourceLineNo">455</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.455"></a>
<span class="sourceLineNo">456</span>   * the specified server.<a name="line.456"></a>
<span class="sourceLineNo">457</span>   * @param connection connection we're using<a name="line.457"></a>
<span class="sourceLineNo">458</span>   * @param tableName table to check<a name="line.458"></a>
<span class="sourceLineNo">459</span>   * @return true if the table exists in meta, false if not<a name="line.459"></a>
<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
<span class="sourceLineNo">461</span>  public static boolean tableExists(Connection connection,<a name="line.461"></a>
<span class="sourceLineNo">462</span>      final TableName tableName)<a name="line.462"></a>
<span class="sourceLineNo">463</span>  throws IOException {<a name="line.463"></a>
<span class="sourceLineNo">464</span>    // Catalog tables always exist.<a name="line.464"></a>
<span class="sourceLineNo">465</span>    return tableName.equals(TableName.META_TABLE_NAME) ||<a name="line.465"></a>
<span class="sourceLineNo">466</span>        getTableState(connection, tableName) != null;<a name="line.466"></a>
<span class="sourceLineNo">467</span>  }<a name="line.467"></a>
<span class="sourceLineNo">468</span><a name="line.468"></a>
<span class="sourceLineNo">469</span>  /**<a name="line.469"></a>
<span class="sourceLineNo">470</span>   * Lists all of the regions currently in META.<a name="line.470"></a>
<span class="sourceLineNo">471</span>   *<a name="line.471"></a>
<span class="sourceLineNo">472</span>   * @param connection to connect with<a name="line.472"></a>
<span class="sourceLineNo">473</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.473"></a>
<span class="sourceLineNo">474</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.474"></a>
<span class="sourceLineNo">475</span>   * @return List of all user-space regions.<a name="line.475"></a>
<span class="sourceLineNo">476</span>   */<a name="line.476"></a>
<span class="sourceLineNo">477</span>  @VisibleForTesting<a name="line.477"></a>
<span class="sourceLineNo">478</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.478"></a>
<span class="sourceLineNo">479</span>      boolean excludeOfflinedSplitParents)<a name="line.479"></a>
<span class="sourceLineNo">480</span>      throws IOException {<a name="line.480"></a>
<span class="sourceLineNo">481</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.481"></a>
<span class="sourceLineNo">482</span><a name="line.482"></a>
<span class="sourceLineNo">483</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.483"></a>
<span class="sourceLineNo">484</span>        excludeOfflinedSplitParents);<a name="line.484"></a>
<span class="sourceLineNo">485</span><a name="line.485"></a>
<span class="sourceLineNo">486</span>    return getListOfRegionInfos(result);<a name="line.486"></a>
<span class="sourceLineNo">487</span><a name="line.487"></a>
<span class="sourceLineNo">488</span>  }<a name="line.488"></a>
<span class="sourceLineNo">489</span><a name="line.489"></a>
<span class="sourceLineNo">490</span>  /**<a name="line.490"></a>
<span class="sourceLineNo">491</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.491"></a>
<span class="sourceLineNo">492</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.492"></a>
<span class="sourceLineNo">493</span>   * @param connection connection we're using<a name="line.493"></a>
<span class="sourceLineNo">494</span>   * @param tableName table we're looking for<a name="line.494"></a>
<span class="sourceLineNo">495</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.495"></a>
<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
<span class="sourceLineNo">497</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.497"></a>
<span class="sourceLineNo">498</span>  throws IOException {<a name="line.498"></a>
<span class="sourceLineNo">499</span>    return getTableRegions(connection, tableName, false);<a name="line.499"></a>
<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
<span class="sourceLineNo">501</span><a name="line.501"></a>
<span class="sourceLineNo">502</span>  /**<a name="line.502"></a>
<span class="sourceLineNo">503</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.503"></a>
<span class="sourceLineNo">504</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.504"></a>
<span class="sourceLineNo">505</span>   * @param connection connection we're using<a name="line.505"></a>
<span class="sourceLineNo">506</span>   * @param tableName table we're looking for<a name="line.506"></a>
<span class="sourceLineNo">507</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.507"></a>
<span class="sourceLineNo">508</span>   * parents in the return.<a name="line.508"></a>
<span class="sourceLineNo">509</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.509"></a>
<span class="sourceLineNo">510</span>   */<a name="line.510"></a>
<span class="sourceLineNo">511</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.511"></a>
<span class="sourceLineNo">512</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.512"></a>
<span class="sourceLineNo">513</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.513"></a>
<span class="sourceLineNo">514</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.514"></a>
<span class="sourceLineNo">515</span>    return getListOfRegionInfos(result);<a name="line.515"></a>
<span class="sourceLineNo">516</span>  }<a name="line.516"></a>
<span class="sourceLineNo">517</span><a name="line.517"></a>
<span class="sourceLineNo">518</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.518"></a>
<span class="sourceLineNo">519</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.519"></a>
<span class="sourceLineNo">520</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.520"></a>
<span class="sourceLineNo">521</span>      return Collections.emptyList();<a name="line.521"></a>
<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
<span class="sourceLineNo">523</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.523"></a>
<span class="sourceLineNo">524</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.524"></a>
<span class="sourceLineNo">525</span>      result.add(pair.getFirst());<a name="line.525"></a>
<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
<span class="sourceLineNo">527</span>    return result;<a name="line.527"></a>
<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
<span class="sourceLineNo">529</span><a name="line.529"></a>
<span class="sourceLineNo">530</span>  /**<a name="line.530"></a>
<span class="sourceLineNo">531</span>   * @param tableName table we're working with<a name="line.531"></a>
<span class="sourceLineNo">532</span>   * @return start row for scanning META according to query type<a name="line.532"></a>
<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
<span class="sourceLineNo">534</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.534"></a>
<span class="sourceLineNo">535</span>    if (tableName == null) {<a name="line.535"></a>
<span class="sourceLineNo">536</span>      return null;<a name="line.536"></a>
<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
<span class="sourceLineNo">538</span>    switch (type) {<a name="line.538"></a>
<span class="sourceLineNo">539</span>    case REGION:<a name="line.539"></a>
<span class="sourceLineNo">540</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.540"></a>
<span class="sourceLineNo">541</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.541"></a>
<span class="sourceLineNo">542</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.542"></a>
<span class="sourceLineNo">543</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.543"></a>
<span class="sourceLineNo">544</span>      return startRow;<a name="line.544"></a>
<span class="sourceLineNo">545</span>    case ALL:<a name="line.545"></a>
<span class="sourceLineNo">546</span>    case TABLE:<a name="line.546"></a>
<span class="sourceLineNo">547</span>    default:<a name="line.547"></a>
<span class="sourceLineNo">548</span>      return tableName.getName();<a name="line.548"></a>
<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
<span class="sourceLineNo">550</span>  }<a name="line.550"></a>
<span class="sourceLineNo">551</span><a name="line.551"></a>
<span class="sourceLineNo">552</span>  /**<a name="line.552"></a>
<span class="sourceLineNo">553</span>   * @param tableName table we're working with<a name="line.553"></a>
<span class="sourceLineNo">554</span>   * @return stop row for scanning META according to query type<a name="line.554"></a>
<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
<span class="sourceLineNo">556</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.556"></a>
<span class="sourceLineNo">557</span>    if (tableName == null) {<a name="line.557"></a>
<span class="sourceLineNo">558</span>      return null;<a name="line.558"></a>
<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
<span class="sourceLineNo">560</span>    final byte[] stopRow;<a name="line.560"></a>
<span class="sourceLineNo">561</span>    switch (type) {<a name="line.561"></a>
<span class="sourceLineNo">562</span>    case REGION:<a name="line.562"></a>
<span class="sourceLineNo">563</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.563"></a>
<span class="sourceLineNo">564</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.564"></a>
<span class="sourceLineNo">565</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.565"></a>
<span class="sourceLineNo">566</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.566"></a>
<span class="sourceLineNo">567</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.567"></a>
<span class="sourceLineNo">568</span>      break;<a name="line.568"></a>
<span class="sourceLineNo">569</span>    case ALL:<a name="line.569"></a>
<span class="sourceLineNo">570</span>    case TABLE:<a name="line.570"></a>
<span class="sourceLineNo">571</span>    default:<a name="line.571"></a>
<span class="sourceLineNo">572</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.572"></a>
<span class="sourceLineNo">573</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.573"></a>
<span class="sourceLineNo">574</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.574"></a>
<span class="sourceLineNo">575</span>      break;<a name="line.575"></a>
<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
<span class="sourceLineNo">577</span>    return stopRow;<a name="line.577"></a>
<span class="sourceLineNo">578</span>  }<a name="line.578"></a>
<span class="sourceLineNo">579</span><a name="line.579"></a>
<span class="sourceLineNo">580</span>  /**<a name="line.580"></a>
<span class="sourceLineNo">581</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.581"></a>
<span class="sourceLineNo">582</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.582"></a>
<span class="sourceLineNo">583</span>   * This is a better alternative to just using a start row and scan until<a name="line.583"></a>
<span class="sourceLineNo">584</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.584"></a>
<span class="sourceLineNo">585</span>   * name.<a name="line.585"></a>
<span class="sourceLineNo">586</span>   * @param tableName bytes of table's name<a name="line.586"></a>
<span class="sourceLineNo">587</span>   * @return configured Scan object<a name="line.587"></a>
<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
<span class="sourceLineNo">589</span>  @Deprecated<a name="line.589"></a>
<span class="sourceLineNo">590</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.590"></a>
<span class="sourceLineNo">591</span>    // Start key is just the table name with delimiters<a name="line.591"></a>
<span class="sourceLineNo">592</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.592"></a>
<span class="sourceLineNo">593</span>    // Stop key appends the smallest possible char to the table name<a name="line.593"></a>
<span class="sourceLineNo">594</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.594"></a>
<span class="sourceLineNo">595</span><a name="line.595"></a>
<span class="sourceLineNo">596</span>    Scan scan = getMetaScan(connection, -1);<a name="line.596"></a>
<span class="sourceLineNo">597</span>    scan.setStartRow(startKey);<a name="line.597"></a>
<span class="sourceLineNo">598</span>    scan.setStopRow(stopKey);<a name="line.598"></a>
<span class="sourceLineNo">599</span>    return scan;<a name="line.599"></a>
<span class="sourceLineNo">600</span>  }<a name="line.600"></a>
<span class="sourceLineNo">601</span><a name="line.601"></a>
<span class="sourceLineNo">602</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.602"></a>
<span class="sourceLineNo">603</span>    Scan scan = new Scan();<a name="line.603"></a>
<span class="sourceLineNo">604</span>    int scannerCaching = connection.getConfiguration()<a name="line.604"></a>
<span class="sourceLineNo">605</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.605"></a>
<span class="sourceLineNo">606</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.606"></a>
<span class="sourceLineNo">607</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.607"></a>
<span class="sourceLineNo">608</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.608"></a>
<span class="sourceLineNo">609</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.609"></a>
<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
<span class="sourceLineNo">611</span>    if (rowUpperLimit &gt; 0) {<a name="line.611"></a>
<span class="sourceLineNo">612</span>      scan.setLimit(rowUpperLimit);<a name="line.612"></a>
<span class="sourceLineNo">613</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.613"></a>
<span class="sourceLineNo">614</span>    }<a name="line.614"></a>
<span class="sourceLineNo">615</span>    scan.setCaching(scannerCaching);<a name="line.615"></a>
<span class="sourceLineNo">616</span>    return scan;<a name="line.616"></a>
<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
<span class="sourceLineNo">619</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.619"></a>
<span class="sourceLineNo">620</span>   * @param connection connection we're using<a name="line.620"></a>
<span class="sourceLineNo">621</span>   * @param tableName table we're looking for<a name="line.621"></a>
<span class="sourceLineNo">622</span>   * @return Return list of regioninfos and server.<a name="line.622"></a>
<span class="sourceLineNo">623</span>   */<a name="line.623"></a>
<span class="sourceLineNo">624</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.624"></a>
<span class="sourceLineNo">625</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.625"></a>
<span class="sourceLineNo">626</span>      throws IOException {<a name="line.626"></a>
<span class="sourceLineNo">627</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.627"></a>
<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
<span class="sourceLineNo">629</span><a name="line.629"></a>
<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
<span class="sourceLineNo">631</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.631"></a>
<span class="sourceLineNo">632</span>   * @param connection connection we're using<a name="line.632"></a>
<span class="sourceLineNo">633</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.633"></a>
<span class="sourceLineNo">634</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.634"></a>
<span class="sourceLineNo">635</span>   * @return Return list of regioninfos and server addresses.<a name="line.635"></a>
<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
<span class="sourceLineNo">637</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.637"></a>
<span class="sourceLineNo">638</span>      Connection connection, @Nullable final TableName tableName,<a name="line.638"></a>
<span class="sourceLineNo">639</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.639"></a>
<span class="sourceLineNo">640</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.640"></a>
<span class="sourceLineNo">641</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.641"></a>
<span class="sourceLineNo">642</span>        + " use MetaTableLocator instead");<a name="line.642"></a>
<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
<span class="sourceLineNo">644</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.644"></a>
<span class="sourceLineNo">645</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.645"></a>
<span class="sourceLineNo">646</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.646"></a>
<span class="sourceLineNo">647</span>        private RegionLocations current = null;<a name="line.647"></a>
<span class="sourceLineNo">648</span><a name="line.648"></a>
<span class="sourceLineNo">649</span>        @Override<a name="line.649"></a>
<span class="sourceLineNo">650</span>        public boolean visit(Result r) throws IOException {<a name="line.650"></a>
<span class="sourceLineNo">651</span>          current = getRegionLocations(r);<a name="line.651"></a>
<span class="sourceLineNo">652</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.652"></a>
<span class="sourceLineNo">653</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.653"></a>
<span class="sourceLineNo">654</span>            return true;<a name="line.654"></a>
<span class="sourceLineNo">655</span>          }<a name="line.655"></a>
<span class="sourceLineNo">656</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.656"></a>
<span class="sourceLineNo">657</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.657"></a>
<span class="sourceLineNo">658</span>          // Else call super and add this Result to the collection.<a name="line.658"></a>
<span class="sourceLineNo">659</span>          return super.visit(r);<a name="line.659"></a>
<span class="sourceLineNo">660</span>        }<a name="line.660"></a>
<span class="sourceLineNo">661</span><a name="line.661"></a>
<span class="sourceLineNo">662</span>        @Override<a name="line.662"></a>
<span class="sourceLineNo">663</span>        void add(Result r) {<a name="line.663"></a>
<span class="sourceLineNo">664</span>          if (current == null) {<a name="line.664"></a>
<span class="sourceLineNo">665</span>            return;<a name="line.665"></a>
<span class="sourceLineNo">666</span>          }<a name="line.666"></a>
<span class="sourceLineNo">667</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.667"></a>
<span class="sourceLineNo">668</span>            if (loc != null) {<a name="line.668"></a>
<span class="sourceLineNo">669</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.669"></a>
<span class="sourceLineNo">670</span>            }<a name="line.670"></a>
<span class="sourceLineNo">671</span>          }<a name="line.671"></a>
<span class="sourceLineNo">672</span>        }<a name="line.672"></a>
<span class="sourceLineNo">673</span>      };<a name="line.673"></a>
<span class="sourceLineNo">674</span>    scanMeta(connection,<a name="line.674"></a>
<span class="sourceLineNo">675</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.675"></a>
<span class="sourceLineNo">676</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.676"></a>
<span class="sourceLineNo">677</span>        QueryType.REGION, visitor);<a name="line.677"></a>
<span class="sourceLineNo">678</span>    return visitor.getResults();<a name="line.678"></a>
<span class="sourceLineNo">679</span>  }<a name="line.679"></a>
<span class="sourceLineNo">680</span><a name="line.680"></a>
<span class="sourceLineNo">681</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.681"></a>
<span class="sourceLineNo">682</span>    throws IOException {<a name="line.682"></a>
<span class="sourceLineNo">683</span>    Visitor v = r -&gt; {<a name="line.683"></a>
<span class="sourceLineNo">684</span>      if (r ==  null || r.isEmpty()) {<a name="line.684"></a>
<span class="sourceLineNo">685</span>        return true;<a name="line.685"></a>
<span class="sourceLineNo">686</span>      }<a name="line.686"></a>
<span class="sourceLineNo">687</span>      LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.687"></a>
<span class="sourceLineNo">688</span>      TableState state = getTableState(r);<a name="line.688"></a>
<span class="sourceLineNo">689</span>      if (state != null) {<a name="line.689"></a>
<span class="sourceLineNo">690</span>        LOG.info("fullScanMetaAndPrint.Table State={}" + state);<a name="line.690"></a>
<span class="sourceLineNo">691</span>      } else {<a name="line.691"></a>
<span class="sourceLineNo">692</span>        RegionLocations locations = getRegionLocations(r);<a name="line.692"></a>
<span class="sourceLineNo">693</span>        if (locations == null) {<a name="line.693"></a>
<span class="sourceLineNo">694</span>          return true;<a name="line.694"></a>
<span class="sourceLineNo">695</span>        }<a name="line.695"></a>
<span class="sourceLineNo">696</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.696"></a>
<span class="sourceLineNo">697</span>          if (loc != null) {<a name="line.697"></a>
<span class="sourceLineNo">698</span>            LOG.info("fullScanMetaAndPrint.HRI Print={}", loc.getRegion());<a name="line.698"></a>
<span class="sourceLineNo">699</span>          }<a name="line.699"></a>
<span class="sourceLineNo">700</span>        }<a name="line.700"></a>
<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
<span class="sourceLineNo">702</span>      return true;<a name="line.702"></a>
<span class="sourceLineNo">703</span>    };<a name="line.703"></a>
<span class="sourceLineNo">704</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.704"></a>
<span class="sourceLineNo">705</span>  }<a name="line.705"></a>
<span class="sourceLineNo">706</span><a name="line.706"></a>
<span class="sourceLineNo">707</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.707"></a>
<span class="sourceLineNo">708</span>      TableName tableName) throws IOException {<a name="line.708"></a>
<span class="sourceLineNo">709</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.709"></a>
<span class="sourceLineNo">710</span>  }<a name="line.710"></a>
<span class="sourceLineNo">711</span><a name="line.711"></a>
<span class="sourceLineNo">712</span>  private static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.712"></a>
<span class="sourceLineNo">713</span>      final Visitor visitor) throws IOException {<a name="line.713"></a>
<span class="sourceLineNo">714</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.714"></a>
<span class="sourceLineNo">715</span>      type, maxRows, visitor);<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>  private static void scanMeta(Connection connection, @Nullable final byte[] startRow,<a name="line.718"></a>
<span class="sourceLineNo">719</span>      @Nullable final byte[] stopRow, QueryType type, final Visitor visitor) throws IOException {<a name="line.719"></a>
<span class="sourceLineNo">720</span>    scanMeta(connection, startRow, stopRow, type, Integer.MAX_VALUE, visitor);<a name="line.720"></a>
<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
<span class="sourceLineNo">722</span><a name="line.722"></a>
<span class="sourceLineNo">723</span>  /**<a name="line.723"></a>
<span class="sourceLineNo">724</span>   * Performs a scan of META table for given table starting from given row.<a name="line.724"></a>
<span class="sourceLineNo">725</span>   * @param connection connection we're using<a name="line.725"></a>
<span class="sourceLineNo">726</span>   * @param visitor    visitor to call<a name="line.726"></a>
<span class="sourceLineNo">727</span>   * @param tableName  table withing we scan<a name="line.727"></a>
<span class="sourceLineNo">728</span>   * @param row        start scan from this row<a name="line.728"></a>
<span class="sourceLineNo">729</span>   * @param rowLimit   max number of rows to return<a name="line.729"></a>
<span class="sourceLineNo">730</span>   */<a name="line.730"></a>
<span class="sourceLineNo">731</span>  public static void scanMeta(Connection connection, final Visitor visitor,<a name="line.731"></a>
<span class="sourceLineNo">732</span>      final TableName tableName, final byte[] row, final int rowLimit) throws IOException {<a name="line.732"></a>
<span class="sourceLineNo">733</span>    byte[] startRow = null;<a name="line.733"></a>
<span class="sourceLineNo">734</span>    byte[] stopRow = null;<a name="line.734"></a>
<span class="sourceLineNo">735</span>    if (tableName != null) {<a name="line.735"></a>
<span class="sourceLineNo">736</span>      startRow = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.736"></a>
<span class="sourceLineNo">737</span>      if (row != null) {<a name="line.737"></a>
<span class="sourceLineNo">738</span>        RegionInfo closestRi = getClosestRegionInfo(connection, tableName, row);<a name="line.738"></a>
<span class="sourceLineNo">739</span>        startRow =<a name="line.739"></a>
<span class="sourceLineNo">740</span>          RegionInfo.createRegionName(tableName, closestRi.getStartKey(), HConstants.ZEROES, false);<a name="line.740"></a>
<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
<span class="sourceLineNo">742</span>      stopRow = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.742"></a>
<span class="sourceLineNo">743</span>    }<a name="line.743"></a>
<span class="sourceLineNo">744</span>    scanMeta(connection, startRow, stopRow, QueryType.REGION, rowLimit, visitor);<a name="line.744"></a>
<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
<span class="sourceLineNo">746</span><a name="line.746"></a>
<span class="sourceLineNo">747</span>  /**<a name="line.747"></a>
<span class="sourceLineNo">748</span>   * Performs a scan of META table.<a name="line.748"></a>
<span class="sourceLineNo">749</span>   * @param connection connection we're using<a name="line.749"></a>
<span class="sourceLineNo">750</span>   * @param startRow Where to start the scan. Pass null if want to begin scan<a name="line.750"></a>
<span class="sourceLineNo">751</span>   *                 at first row.<a name="line.751"></a>
<span class="sourceLineNo">752</span>   * @param stopRow Where to stop the scan. Pass null if want to scan all rows<a name="line.752"></a>
<span class="sourceLineNo">753</span>   *                from the start one<a name="line.753"></a>
<span class="sourceLineNo">754</span>   * @param type scanned part of meta<a name="line.754"></a>
<span class="sourceLineNo">755</span>   * @param maxRows maximum rows to return<a name="line.755"></a>
<span class="sourceLineNo">756</span>   * @param visitor Visitor invoked against each row.<a name="line.756"></a>
<span class="sourceLineNo">757</span>   */<a name="line.757"></a>
<span class="sourceLineNo">758</span>  static void scanMeta(Connection connection, @Nullable final byte[] startRow,<a name="line.758"></a>
<span class="sourceLineNo">759</span>        @Nullable final byte[] stopRow, QueryType type, int maxRows, final Visitor visitor)<a name="line.759"></a>
<span class="sourceLineNo">760</span>      throws IOException {<a name="line.760"></a>
<span class="sourceLineNo">761</span>    scanMeta(connection, startRow, stopRow, type, null, maxRows, visitor);<a name="line.761"></a>
<span class="sourceLineNo">762</span>  }<a name="line.762"></a>
<span class="sourceLineNo">763</span><a name="line.763"></a>
<span class="sourceLineNo">764</span>  private static void scanMeta(Connection connection, @Nullable final byte[] startRow,<a name="line.764"></a>
<span class="sourceLineNo">765</span>      @Nullable final byte[] stopRow, QueryType type, @Nullable Filter filter, int maxRows,<a name="line.765"></a>
<span class="sourceLineNo">766</span>      final Visitor visitor) throws IOException {<a name="line.766"></a>
<span class="sourceLineNo">767</span>    int rowUpperLimit = maxRows &gt; 0 ? maxRows : Integer.MAX_VALUE;<a name="line.767"></a>
<span class="sourceLineNo">768</span>    Scan scan = getMetaScan(connection, rowUpperLimit);<a name="line.768"></a>
<span class="sourceLineNo">769</span><a name="line.769"></a>
<span class="sourceLineNo">770</span>    for (byte[] family : type.getFamilies()) {<a name="line.770"></a>
<span class="sourceLineNo">771</span>      scan.addFamily(family);<a name="line.771"></a>
<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
<span class="sourceLineNo">773</span>    if (startRow != null) {<a name="line.773"></a>
<span class="sourceLineNo">774</span>      scan.withStartRow(startRow);<a name="line.774"></a>
<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
<span class="sourceLineNo">776</span>    if (stopRow != null) {<a name="line.776"></a>
<span class="sourceLineNo">777</span>      scan.withStopRow(stopRow);<a name="line.777"></a>
<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
<span class="sourceLineNo">779</span>    if (filter != null) {<a name="line.779"></a>
<span class="sourceLineNo">780</span>      scan.setFilter(filter);<a name="line.780"></a>
<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
<span class="sourceLineNo">782</span><a name="line.782"></a>
<span class="sourceLineNo">783</span>    if (LOG.isTraceEnabled()) {<a name="line.783"></a>
<span class="sourceLineNo">784</span>      LOG.trace("Scanning META" + " starting at row=" + Bytes.toStringBinary(startRow) +<a name="line.784"></a>
<span class="sourceLineNo">785</span>        " stopping at row=" + Bytes.toStringBinary(stopRow) + " for max=" + rowUpperLimit +<a name="line.785"></a>
<span class="sourceLineNo">786</span>        " with caching=" + scan.getCaching());<a name="line.786"></a>
<span class="sourceLineNo">787</span>    }<a name="line.787"></a>
<span class="sourceLineNo">788</span><a name="line.788"></a>
<span class="sourceLineNo">789</span>    int currentRow = 0;<a name="line.789"></a>
<span class="sourceLineNo">790</span>    try (Table metaTable = getMetaHTable(connection)) {<a name="line.790"></a>
<span class="sourceLineNo">791</span>      try (ResultScanner scanner = metaTable.getScanner(scan)) {<a name="line.791"></a>
<span class="sourceLineNo">792</span>        Result data;<a name="line.792"></a>
<span class="sourceLineNo">793</span>        while ((data = scanner.next()) != null) {<a name="line.793"></a>
<span class="sourceLineNo">794</span>          if (data.isEmpty()) continue;<a name="line.794"></a>
<span class="sourceLineNo">795</span>          // Break if visit returns false.<a name="line.795"></a>
<span class="sourceLineNo">796</span>          if (!visitor.visit(data)) break;<a name="line.796"></a>
<span class="sourceLineNo">797</span>          if (++currentRow &gt;= rowUpperLimit) break;<a name="line.797"></a>
<span class="sourceLineNo">798</span>        }<a name="line.798"></a>
<span class="sourceLineNo">799</span>      }<a name="line.799"></a>
<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
<span class="sourceLineNo">801</span>    if (visitor instanceof Closeable) {<a name="line.801"></a>
<span class="sourceLineNo">802</span>      try {<a name="line.802"></a>
<span class="sourceLineNo">803</span>        ((Closeable) visitor).close();<a name="line.803"></a>
<span class="sourceLineNo">804</span>      } catch (Throwable t) {<a name="line.804"></a>
<span class="sourceLineNo">805</span>        ExceptionUtil.rethrowIfInterrupt(t);<a name="line.805"></a>
<span class="sourceLineNo">806</span>        LOG.debug("Got exception in closing the meta scanner visitor", t);<a name="line.806"></a>
<span class="sourceLineNo">807</span>      }<a name="line.807"></a>
<span class="sourceLineNo">808</span>    }<a name="line.808"></a>
<span class="sourceLineNo">809</span>  }<a name="line.809"></a>
<span class="sourceLineNo">810</span><a name="line.810"></a>
<span class="sourceLineNo">811</span>  /**<a name="line.811"></a>
<span class="sourceLineNo">812</span>   * @return Get closest metatable region row to passed &lt;code&gt;row&lt;/code&gt;<a name="line.812"></a>
<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
<span class="sourceLineNo">814</span>  @NonNull<a name="line.814"></a>
<span class="sourceLineNo">815</span>  private static RegionInfo getClosestRegionInfo(Connection connection,<a name="line.815"></a>
<span class="sourceLineNo">816</span>      @NonNull final TableName tableName, @NonNull final byte[] row) throws IOException {<a name="line.816"></a>
<span class="sourceLineNo">817</span>    byte[] searchRow = RegionInfo.createRegionName(tableName, row, HConstants.NINES, false);<a name="line.817"></a>
<span class="sourceLineNo">818</span>    Scan scan = getMetaScan(connection, 1);<a name="line.818"></a>
<span class="sourceLineNo">819</span>    scan.setReversed(true);<a name="line.819"></a>
<span class="sourceLineNo">820</span>    scan.withStartRow(searchRow);<a name="line.820"></a>
<span class="sourceLineNo">821</span>    try (ResultScanner resultScanner = getMetaHTable(connection).getScanner(scan)) {<a name="line.821"></a>
<span class="sourceLineNo">822</span>      Result result = resultScanner.next();<a name="line.822"></a>
<span class="sourceLineNo">823</span>      if (result == null) {<a name="line.823"></a>
<span class="sourceLineNo">824</span>        throw new TableNotFoundException("Cannot find row in META " +<a name="line.824"></a>
<span class="sourceLineNo">825</span>            " for table: " + tableName + ", row=" + Bytes.toStringBinary(row));<a name="line.825"></a>
<span class="sourceLineNo">826</span>      }<a name="line.826"></a>
<span class="sourceLineNo">827</span>      RegionInfo regionInfo = getRegionInfo(result);<a name="line.827"></a>
<span class="sourceLineNo">828</span>      if (regionInfo == null) {<a name="line.828"></a>
<span class="sourceLineNo">829</span>        throw new IOException("RegionInfo was null or empty in Meta for " +<a name="line.829"></a>
<span class="sourceLineNo">830</span>            tableName + ", row=" + Bytes.toStringBinary(row));<a name="line.830"></a>
<span class="sourceLineNo">831</span>      }<a name="line.831"></a>
<span class="sourceLineNo">832</span>      return regionInfo;<a name="line.832"></a>
<span class="sourceLineNo">833</span>    }<a name="line.833"></a>
<span class="sourceLineNo">834</span>  }<a name="line.834"></a>
<span class="sourceLineNo">835</span><a name="line.835"></a>
<span class="sourceLineNo">836</span>  /**<a name="line.836"></a>
<span class="sourceLineNo">837</span>   * Returns the column family used for meta columns.<a name="line.837"></a>
<span class="sourceLineNo">838</span>   * @return HConstants.CATALOG_FAMILY.<a name="line.838"></a>
<span class="sourceLineNo">839</span>   */<a name="line.839"></a>
<span class="sourceLineNo">840</span>  public static byte[] getCatalogFamily() {<a name="line.840"></a>
<span class="sourceLineNo">841</span>    return HConstants.CATALOG_FAMILY;<a name="line.841"></a>
<span class="sourceLineNo">842</span>  }<a name="line.842"></a>
<span class="sourceLineNo">843</span><a name="line.843"></a>
<span class="sourceLineNo">844</span>  /**<a name="line.844"></a>
<span class="sourceLineNo">845</span>   * Returns the column family used for table columns.<a name="line.845"></a>
<span class="sourceLineNo">846</span>   * @return HConstants.TABLE_FAMILY.<a name="line.846"></a>
<span class="sourceLineNo">847</span>   */<a name="line.847"></a>
<span class="sourceLineNo">848</span>  private static byte[] getTableFamily() {<a name="line.848"></a>
<span class="sourceLineNo">849</span>    return HConstants.TABLE_FAMILY;<a name="line.849"></a>
<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
<span class="sourceLineNo">851</span><a name="line.851"></a>
<span class="sourceLineNo">852</span>  /**<a name="line.852"></a>
<span class="sourceLineNo">853</span>   * Returns the column qualifier for serialized region info<a name="line.853"></a>
<span class="sourceLineNo">854</span>   * @return HConstants.REGIONINFO_QUALIFIER<a name="line.854"></a>
<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
<span class="sourceLineNo">856</span>  public static byte[] getRegionInfoColumn() {<a name="line.856"></a>
<span class="sourceLineNo">857</span>    return HConstants.REGIONINFO_QUALIFIER;<a name="line.857"></a>
<span class="sourceLineNo">858</span>  }<a name="line.858"></a>
<span class="sourceLineNo">859</span><a name="line.859"></a>
<span class="sourceLineNo">860</span>  /**<a name="line.860"></a>
<span class="sourceLineNo">861</span>   * Returns the column qualifier for serialized table state<a name="line.861"></a>
<span class="sourceLineNo">862</span>   * @return HConstants.TABLE_STATE_QUALIFIER<a name="line.862"></a>
<span class="sourceLineNo">863</span>   */<a name="line.863"></a>
<span class="sourceLineNo">864</span>  private static byte[] getTableStateColumn() {<a name="line.864"></a>
<span class="sourceLineNo">865</span>    return HConstants.TABLE_STATE_QUALIFIER;<a name="line.865"></a>
<span class="sourceLineNo">866</span>  }<a name="line.866"></a>
<span class="sourceLineNo">867</span><a name="line.867"></a>
<span class="sourceLineNo">868</span>  /**<a name="line.868"></a>
<span class="sourceLineNo">869</span>   * Returns the column qualifier for serialized region state<a name="line.869"></a>
<span class="sourceLineNo">870</span>   * @return HConstants.STATE_QUALIFIER<a name="line.870"></a>
<span class="sourceLineNo">871</span>   */<a name="line.871"></a>
<span class="sourceLineNo">872</span>  private static byte[] getRegionStateColumn() {<a name="line.872"></a>
<span class="sourceLineNo">873</span>    return HConstants.STATE_QUALIFIER;<a name="line.873"></a>
<span class="sourceLineNo">874</span>  }<a name="line.874"></a>
<span class="sourceLineNo">875</span><a name="line.875"></a>
<span class="sourceLineNo">876</span>  /**<a name="line.876"></a>
<span class="sourceLineNo">877</span>   * Returns the column qualifier for serialized region state<a name="line.877"></a>
<span class="sourceLineNo">878</span>   * @param replicaId the replicaId of the region<a name="line.878"></a>
<span class="sourceLineNo">879</span>   * @return a byte[] for state qualifier<a name="line.879"></a>
<span class="sourceLineNo">880</span>   */<a name="line.880"></a>
<span class="sourceLineNo">881</span>  @VisibleForTesting<a name="line.881"></a>
<span class="sourceLineNo">882</span>  static byte[] getRegionStateColumn(int replicaId) {<a name="line.882"></a>
<span class="sourceLineNo">883</span>    return replicaId == 0 ? HConstants.STATE_QUALIFIER<a name="line.883"></a>
<span class="sourceLineNo">884</span>        : Bytes.toBytes(HConstants.STATE_QUALIFIER_STR + META_REPLICA_ID_DELIMITER<a name="line.884"></a>
<span class="sourceLineNo">885</span>            + String.format(RegionInfo.REPLICA_ID_FORMAT, replicaId));<a name="line.885"></a>
<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
<span class="sourceLineNo">887</span><a name="line.887"></a>
<span class="sourceLineNo">888</span>  /**<a name="line.888"></a>
<span class="sourceLineNo">889</span>   * Returns the column qualifier for serialized region state<a name="line.889"></a>
<span class="sourceLineNo">890</span>   * @param replicaId the replicaId of the region<a name="line.890"></a>
<span class="sourceLineNo">891</span>   * @return a byte[] for sn column qualifier<a name="line.891"></a>
<span class="sourceLineNo">892</span>   */<a name="line.892"></a>
<span class="sourceLineNo">893</span>  @VisibleForTesting<a name="line.893"></a>
<span class="sourceLineNo">894</span>  static byte[] getServerNameColumn(int replicaId) {<a name="line.894"></a>
<span class="sourceLineNo">895</span>    return replicaId == 0 ? HConstants.SERVERNAME_QUALIFIER<a name="line.895"></a>
<span class="sourceLineNo">896</span>        : Bytes.toBytes(HConstants.SERVERNAME_QUALIFIER_STR + META_REPLICA_ID_DELIMITER<a name="line.896"></a>
<span class="sourceLineNo">897</span>            + String.format(RegionInfo.REPLICA_ID_FORMAT, replicaId));<a name="line.897"></a>
<span class="sourceLineNo">898</span>  }<a name="line.898"></a>
<span class="sourceLineNo">899</span><a name="line.899"></a>
<span class="sourceLineNo">900</span>  /**<a name="line.900"></a>
<span class="sourceLineNo">901</span>   * Returns the column qualifier for server column for replicaId<a name="line.901"></a>
<span class="sourceLineNo">902</span>   * @param replicaId the replicaId of the region<a name="line.902"></a>
<span class="sourceLineNo">903</span>   * @return a byte[] for server column qualifier<a name="line.903"></a>
<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
<span class="sourceLineNo">905</span>  @VisibleForTesting<a name="line.905"></a>
<span class="sourceLineNo">906</span>  public static byte[] getServerColumn(int replicaId) {<a name="line.906"></a>
<span class="sourceLineNo">907</span>    return replicaId == 0<a name="line.907"></a>
<span class="sourceLineNo">908</span>      ? HConstants.SERVER_QUALIFIER<a name="line.908"></a>
<span class="sourceLineNo">909</span>      : Bytes.toBytes(HConstants.SERVER_QUALIFIER_STR + META_REPLICA_ID_DELIMITER<a name="line.909"></a>
<span class="sourceLineNo">910</span>      + String.format(RegionInfo.REPLICA_ID_FORMAT, replicaId));<a name="line.910"></a>
<span class="sourceLineNo">911</span>  }<a name="line.911"></a>
<span class="sourceLineNo">912</span><a name="line.912"></a>
<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
<span class="sourceLineNo">914</span>   * Returns the column qualifier for server start code column for replicaId<a name="line.914"></a>
<span class="sourceLineNo">915</span>   * @param replicaId the replicaId of the region<a name="line.915"></a>
<span class="sourceLineNo">916</span>   * @return a byte[] for server start code column qualifier<a name="line.916"></a>
<span class="sourceLineNo">917</span>   */<a name="line.917"></a>
<span class="sourceLineNo">918</span>  @VisibleForTesting<a name="line.918"></a>
<span class="sourceLineNo">919</span>  public static byte[] getStartCodeColumn(int replicaId) {<a name="line.919"></a>
<span class="sourceLineNo">920</span>    return replicaId == 0<a name="line.920"></a>
<span class="sourceLineNo">921</span>      ? HConstants.STARTCODE_QUALIFIER<a name="line.921"></a>
<span class="sourceLineNo">922</span>      : Bytes.toBytes(HConstants.STARTCODE_QUALIFIER_STR + META_REPLICA_ID_DELIMITER<a name="line.922"></a>
<span class="sourceLineNo">923</span>      + String.format(RegionInfo.REPLICA_ID_FORMAT, replicaId));<a name="line.923"></a>
<span class="sourceLineNo">924</span>  }<a name="line.924"></a>
<span class="sourceLineNo">925</span><a name="line.925"></a>
<span class="sourceLineNo">926</span>  /**<a name="line.926"></a>
<span class="sourceLineNo">927</span>   * Returns the column qualifier for seqNum column for replicaId<a name="line.927"></a>
<span class="sourceLineNo">928</span>   * @param replicaId the replicaId of the region<a name="line.928"></a>
<span class="sourceLineNo">929</span>   * @return a byte[] for seqNum column qualifier<a name="line.929"></a>
<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
<span class="sourceLineNo">931</span>  @VisibleForTesting<a name="line.931"></a>
<span class="sourceLineNo">932</span>  public static byte[] getSeqNumColumn(int replicaId) {<a name="line.932"></a>
<span class="sourceLineNo">933</span>    return replicaId == 0<a name="line.933"></a>
<span class="sourceLineNo">934</span>      ? HConstants.SEQNUM_QUALIFIER<a name="line.934"></a>
<span class="sourceLineNo">935</span>      : Bytes.toBytes(HConstants.SEQNUM_QUALIFIER_STR + META_REPLICA_ID_DELIMITER<a name="line.935"></a>
<span class="sourceLineNo">936</span>      + String.format(RegionInfo.REPLICA_ID_FORMAT, replicaId));<a name="line.936"></a>
<span class="sourceLineNo">937</span>  }<a name="line.937"></a>
<span class="sourceLineNo">938</span><a name="line.938"></a>
<span class="sourceLineNo">939</span>  /**<a name="line.939"></a>
<span class="sourceLineNo">940</span>   * Parses the replicaId from the server column qualifier. See top of the class javadoc<a name="line.940"></a>
<span class="sourceLineNo">941</span>   * for the actual meta layout<a name="line.941"></a>
<span class="sourceLineNo">942</span>   * @param serverColumn the column qualifier<a name="line.942"></a>
<span class="sourceLineNo">943</span>   * @return an int for the replicaId<a name="line.943"></a>
<span class="sourceLineNo">944</span>   */<a name="line.944"></a>
<span class="sourceLineNo">945</span>  @VisibleForTesting<a name="line.945"></a>
<span class="sourceLineNo">946</span>  static int parseReplicaIdFromServerColumn(byte[] serverColumn) {<a name="line.946"></a>
<span class="sourceLineNo">947</span>    String serverStr = Bytes.toString(serverColumn);<a name="line.947"></a>
<span class="sourceLineNo">948</span><a name="line.948"></a>
<span class="sourceLineNo">949</span>    Matcher matcher = SERVER_COLUMN_PATTERN.matcher(serverStr);<a name="line.949"></a>
<span class="sourceLineNo">950</span>    if (matcher.matches() &amp;&amp; matcher.groupCount() &gt; 0) {<a name="line.950"></a>
<span class="sourceLineNo">951</span>      String group = matcher.group(1);<a name="line.951"></a>
<span class="sourceLineNo">952</span>      if (group != null &amp;&amp; group.length() &gt; 0) {<a name="line.952"></a>
<span class="sourceLineNo">953</span>        return Integer.parseInt(group.substring(1), 16);<a name="line.953"></a>
<span class="sourceLineNo">954</span>      } else {<a name="line.954"></a>
<span class="sourceLineNo">955</span>        return 0;<a name="line.955"></a>
<span class="sourceLineNo">956</span>      }<a name="line.956"></a>
<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
<span class="sourceLineNo">958</span>    return -1;<a name="line.958"></a>
<span class="sourceLineNo">959</span>  }<a name="line.959"></a>
<span class="sourceLineNo">960</span><a name="line.960"></a>
<span class="sourceLineNo">961</span>  /**<a name="line.961"></a>
<span class="sourceLineNo">962</span>   * Returns a {@link ServerName} from catalog table {@link Result}.<a name="line.962"></a>
<span class="sourceLineNo">963</span>   * @param r Result to pull from<a name="line.963"></a>
<span class="sourceLineNo">964</span>   * @return A ServerName instance or null if necessary fields not found or empty.<a name="line.964"></a>
<span class="sourceLineNo">965</span>   */<a name="line.965"></a>
<span class="sourceLineNo">966</span>  @Nullable<a name="line.966"></a>
<span class="sourceLineNo">967</span>  @InterfaceAudience.Private // for use by HMaster#getTableRegionRow which is used for testing only<a name="line.967"></a>
<span class="sourceLineNo">968</span>  public static ServerName getServerName(final Result r, final int replicaId) {<a name="line.968"></a>
<span class="sourceLineNo">969</span>    byte[] serverColumn = getServerColumn(replicaId);<a name="line.969"></a>
<span class="sourceLineNo">970</span>    Cell cell = r.getColumnLatestCell(getCatalogFamily(), serverColumn);<a name="line.970"></a>
<span class="sourceLineNo">971</span>    if (cell == null || cell.getValueLength() == 0) return null;<a name="line.971"></a>
<span class="sourceLineNo">972</span>    String hostAndPort = Bytes.toString(<a name="line.972"></a>
<span class="sourceLineNo">973</span>      cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());<a name="line.973"></a>
<span class="sourceLineNo">974</span>    byte[] startcodeColumn = getStartCodeColumn(replicaId);<a name="line.974"></a>
<span class="sourceLineNo">975</span>    cell = r.getColumnLatestCell(getCatalogFamily(), startcodeColumn);<a name="line.975"></a>
<span class="sourceLineNo">976</span>    if (cell == null || cell.getValueLength() == 0) return null;<a name="line.976"></a>
<span class="sourceLineNo">977</span>    try {<a name="line.977"></a>
<span class="sourceLineNo">978</span>      return ServerName.valueOf(hostAndPort,<a name="line.978"></a>
<span class="sourceLineNo">979</span>          Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));<a name="line.979"></a>
<span class="sourceLineNo">980</span>    } catch (IllegalArgumentException e) {<a name="line.980"></a>
<span class="sourceLineNo">981</span>      LOG.error("Ignoring invalid region for server " + hostAndPort + "; cell=" + cell, e);<a name="line.981"></a>
<span class="sourceLineNo">982</span>      return null;<a name="line.982"></a>
<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
<span class="sourceLineNo">984</span>  }<a name="line.984"></a>
<span class="sourceLineNo">985</span><a name="line.985"></a>
<span class="sourceLineNo">986</span>  /**<a name="line.986"></a>
<span class="sourceLineNo">987</span>   * The latest seqnum that the server writing to meta observed when opening the region.<a name="line.987"></a>
<span class="sourceLineNo">988</span>   * E.g. the seqNum when the result of {@link #getServerName(Result, int)} was written.<a name="line.988"></a>
<span class="sourceLineNo">989</span>   * @param r Result to pull the seqNum from<a name="line.989"></a>
<span class="sourceLineNo">990</span>   * @return SeqNum, or HConstants.NO_SEQNUM if there's no value written.<a name="line.990"></a>
<span class="sourceLineNo">991</span>   */<a name="line.991"></a>
<span class="sourceLineNo">992</span>  private static long getSeqNumDuringOpen(final Result r, final int replicaId) {<a name="line.992"></a>
<span class="sourceLineNo">993</span>    Cell cell = r.getColumnLatestCell(getCatalogFamily(), getSeqNumColumn(replicaId));<a name="line.993"></a>
<span class="sourceLineNo">994</span>    if (cell == null || cell.getValueLength() == 0) return HConstants.NO_SEQNUM;<a name="line.994"></a>
<span class="sourceLineNo">995</span>    return Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());<a name="line.995"></a>
<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
<span class="sourceLineNo">997</span><a name="line.997"></a>
<span class="sourceLineNo">998</span>  /**<a name="line.998"></a>
<span class="sourceLineNo">999</span>   * Returns the daughter regions by reading the corresponding columns of the catalog table<a name="line.999"></a>
<span class="sourceLineNo">1000</span>   * Result.<a name="line.1000"></a>
<span class="sourceLineNo">1001</span>   * @param data a Result object from the catalog table scan<a name="line.1001"></a>
<span class="sourceLineNo">1002</span>   * @return pair of RegionInfo or PairOfSameType(null, null) if region is not a split parent<a name="line.1002"></a>
<span class="sourceLineNo">1003</span>   */<a name="line.1003"></a>
<span class="sourceLineNo">1004</span>  public static PairOfSameType&lt;RegionInfo&gt; getDaughterRegions(Result data) {<a name="line.1004"></a>
<span class="sourceLineNo">1005</span>    RegionInfo splitA = getRegionInfo(data, HConstants.SPLITA_QUALIFIER);<a name="line.1005"></a>
<span class="sourceLineNo">1006</span>    RegionInfo splitB = getRegionInfo(data, HConstants.SPLITB_QUALIFIER);<a name="line.1006"></a>
<span class="sourceLineNo">1007</span>    return new PairOfSameType&lt;&gt;(splitA, splitB);<a name="line.1007"></a>
<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
<span class="sourceLineNo">1009</span><a name="line.1009"></a>
<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
<span class="sourceLineNo">1011</span>   * Returns an HRegionLocationList extracted from the result.<a name="line.1011"></a>
<span class="sourceLineNo">1012</span>   * @return an HRegionLocationList containing all locations for the region range or null if<a name="line.1012"></a>
<span class="sourceLineNo">1013</span>   *  we can't deserialize the result.<a name="line.1013"></a>
<span class="sourceLineNo">1014</span>   */<a name="line.1014"></a>
<span class="sourceLineNo">1015</span>  @Nullable<a name="line.1015"></a>
<span class="sourceLineNo">1016</span>  public static RegionLocations getRegionLocations(final Result r) {<a name="line.1016"></a>
<span class="sourceLineNo">1017</span>    if (r == null) return null;<a name="line.1017"></a>
<span class="sourceLineNo">1018</span>    RegionInfo regionInfo = getRegionInfo(r, getRegionInfoColumn());<a name="line.1018"></a>
<span class="sourceLineNo">1019</span>    if (regionInfo == null) return null;<a name="line.1019"></a>
<span class="sourceLineNo">1020</span><a name="line.1020"></a>
<span class="sourceLineNo">1021</span>    List&lt;HRegionLocation&gt; locations = new ArrayList&lt;&gt;(1);<a name="line.1021"></a>
<span class="sourceLineNo">1022</span>    NavigableMap&lt;byte[],NavigableMap&lt;byte[],byte[]&gt;&gt; familyMap = r.getNoVersionMap();<a name="line.1022"></a>
<span class="sourceLineNo">1023</span><a name="line.1023"></a>
<span class="sourceLineNo">1024</span>    locations.add(getRegionLocation(r, regionInfo, 0));<a name="line.1024"></a>
<span class="sourceLineNo">1025</span><a name="line.1025"></a>
<span class="sourceLineNo">1026</span>    NavigableMap&lt;byte[], byte[]&gt; infoMap = familyMap.get(getCatalogFamily());<a name="line.1026"></a>
<span class="sourceLineNo">1027</span>    if (infoMap == null) return new RegionLocations(locations);<a name="line.1027"></a>
<span class="sourceLineNo">1028</span><a name="line.1028"></a>
<span class="sourceLineNo">1029</span>    // iterate until all serverName columns are seen<a name="line.1029"></a>
<span class="sourceLineNo">1030</span>    int replicaId = 0;<a name="line.1030"></a>
<span class="sourceLineNo">1031</span>    byte[] serverColumn = getServerColumn(replicaId);<a name="line.1031"></a>
<span class="sourceLineNo">1032</span>    SortedMap&lt;byte[], byte[]&gt; serverMap;<a name="line.1032"></a>
<span class="sourceLineNo">1033</span>    serverMap = infoMap.tailMap(serverColumn, false);<a name="line.1033"></a>
<span class="sourceLineNo">1034</span><a name="line.1034"></a>
<span class="sourceLineNo">1035</span>    if (serverMap.isEmpty()) return new RegionLocations(locations);<a name="line.1035"></a>
<span class="sourceLineNo">1036</span><a name="line.1036"></a>
<span class="sourceLineNo">1037</span>    for (Map.Entry&lt;byte[], byte[]&gt; entry : serverMap.entrySet()) {<a name="line.1037"></a>
<span class="sourceLineNo">1038</span>      replicaId = parseReplicaIdFromServerColumn(entry.getKey());<a name="line.1038"></a>
<span class="sourceLineNo">1039</span>      if (replicaId &lt; 0) {<a name="line.1039"></a>
<span class="sourceLineNo">1040</span>        break;<a name="line.1040"></a>
<span class="sourceLineNo">1041</span>      }<a name="line.1041"></a>
<span class="sourceLineNo">1042</span>      HRegionLocation location = getRegionLocation(r, regionInfo, replicaId);<a name="line.1042"></a>
<span class="sourceLineNo">1043</span>      // In case the region replica is newly created, it's location might be null. We usually do not<a name="line.1043"></a>
<span class="sourceLineNo">1044</span>      // have HRL's in RegionLocations object with null ServerName. They are handled as null HRLs.<a name="line.1044"></a>
<span class="sourceLineNo">1045</span>      if (location.getServerName() == null) {<a name="line.1045"></a>
<span class="sourceLineNo">1046</span>        locations.add(null);<a name="line.1046"></a>
<span class="sourceLineNo">1047</span>      } else {<a name="line.1047"></a>
<span class="sourceLineNo">1048</span>        locations.add(location);<a name="line.1048"></a>
<span class="sourceLineNo">1049</span>      }<a name="line.1049"></a>
<span class="sourceLineNo">1050</span>    }<a name="line.1050"></a>
<span class="sourceLineNo">1051</span><a name="line.1051"></a>
<span class="sourceLineNo">1052</span>    return new RegionLocations(locations);<a name="line.1052"></a>
<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
<span class="sourceLineNo">1054</span><a name="line.1054"></a>
<span class="sourceLineNo">1055</span>  /**<a name="line.1055"></a>
<span class="sourceLineNo">1056</span>   * Returns the HRegionLocation parsed from the given meta row Result<a name="line.1056"></a>
<span class="sourceLineNo">1057</span>   * for the given regionInfo and replicaId. The regionInfo can be the default region info<a name="line.1057"></a>
<span class="sourceLineNo">1058</span>   * for the replica.<a name="line.1058"></a>
<span class="sourceLineNo">1059</span>   * @param r the meta row result<a name="line.1059"></a>
<span class="sourceLineNo">1060</span>   * @param regionInfo RegionInfo for default replica<a name="line.1060"></a>
<span class="sourceLineNo">1061</span>   * @param replicaId the replicaId for the HRegionLocation<a name="line.1061"></a>
<span class="sourceLineNo">1062</span>   * @return HRegionLocation parsed from the given meta row Result for the given replicaId<a name="line.1062"></a>
<span class="sourceLineNo">1063</span>   */<a name="line.1063"></a>
<span class="sourceLineNo">1064</span>  private static HRegionLocation getRegionLocation(final Result r, final RegionInfo regionInfo,<a name="line.1064"></a>
<span class="sourceLineNo">1065</span>                                                   final int replicaId) {<a name="line.1065"></a>
<span class="sourceLineNo">1066</span>    ServerName serverName = getServerName(r, replicaId);<a name="line.1066"></a>
<span class="sourceLineNo">1067</span>    long seqNum = getSeqNumDuringOpen(r, replicaId);<a name="line.1067"></a>
<span class="sourceLineNo">1068</span>    RegionInfo replicaInfo = RegionReplicaUtil.getRegionInfoForReplica(regionInfo, replicaId);<a name="line.1068"></a>
<span class="sourceLineNo">1069</span>    return new HRegionLocation(replicaInfo, serverName, seqNum);<a name="line.1069"></a>
<span class="sourceLineNo">1070</span>  }<a name="line.1070"></a>
<span class="sourceLineNo">1071</span><a name="line.1071"></a>
<span class="sourceLineNo">1072</span>  /**<a name="line.1072"></a>
<span class="sourceLineNo">1073</span>   * Returns RegionInfo object from the column<a name="line.1073"></a>
<span class="sourceLineNo">1074</span>   * HConstants.CATALOG_FAMILY:HConstants.REGIONINFO_QUALIFIER of the catalog<a name="line.1074"></a>
<span class="sourceLineNo">1075</span>   * table Result.<a name="line.1075"></a>
<span class="sourceLineNo">1076</span>   * @param data a Result object from the catalog table scan<a name="line.1076"></a>
<span class="sourceLineNo">1077</span>   * @return RegionInfo or null<a name="line.1077"></a>
<span class="sourceLineNo">1078</span>   */<a name="line.1078"></a>
<span class="sourceLineNo">1079</span>  public static RegionInfo getRegionInfo(Result data) {<a name="line.1079"></a>
<span class="sourceLineNo">1080</span>    return getRegionInfo(data, HConstants.REGIONINFO_QUALIFIER);<a name="line.1080"></a>
<span class="sourceLineNo">1081</span>  }<a name="line.1081"></a>
<span class="sourceLineNo">1082</span><a name="line.1082"></a>
<span class="sourceLineNo">1083</span>  /**<a name="line.1083"></a>
<span class="sourceLineNo">1084</span>   * Returns the RegionInfo object from the column {@link HConstants#CATALOG_FAMILY} and<a name="line.1084"></a>
<span class="sourceLineNo">1085</span>   * &lt;code&gt;qualifier&lt;/code&gt; of the catalog table result.<a name="line.1085"></a>
<span class="sourceLineNo">1086</span>   * @param r a Result object from the catalog table scan<a name="line.1086"></a>
<span class="sourceLineNo">1087</span>   * @param qualifier Column family qualifier<a name="line.1087"></a>
<span class="sourceLineNo">1088</span>   * @return An RegionInfo instance or null.<a name="line.1088"></a>
<span class="sourceLineNo">1089</span>   */<a name="line.1089"></a>
<span class="sourceLineNo">1090</span>  @Nullable<a name="line.1090"></a>
<span class="sourceLineNo">1091</span>  public static RegionInfo getRegionInfo(final Result r, byte [] qualifier) {<a name="line.1091"></a>
<span class="sourceLineNo">1092</span>    Cell cell = r.getColumnLatestCell(getCatalogFamily(), qualifier);<a name="line.1092"></a>
<span class="sourceLineNo">1093</span>    if (cell == null) return null;<a name="line.1093"></a>
<span class="sourceLineNo">1094</span>    return RegionInfo.parseFromOrNull(cell.getValueArray(),<a name="line.1094"></a>
<span class="sourceLineNo">1095</span>      cell.getValueOffset(), cell.getValueLength());<a name="line.1095"></a>
<span class="sourceLineNo">1096</span>  }<a name="line.1096"></a>
<span class="sourceLineNo">1097</span><a name="line.1097"></a>
<span class="sourceLineNo">1098</span>  /**<a name="line.1098"></a>
<span class="sourceLineNo">1099</span>   * Fetch table state for given table from META table<a name="line.1099"></a>
<span class="sourceLineNo">1100</span>   * @param conn connection to use<a name="line.1100"></a>
<span class="sourceLineNo">1101</span>   * @param tableName table to fetch state for<a name="line.1101"></a>
<span class="sourceLineNo">1102</span>   */<a name="line.1102"></a>
<span class="sourceLineNo">1103</span>  @Nullable<a name="line.1103"></a>
<span class="sourceLineNo">1104</span>  public static TableState getTableState(Connection conn, TableName tableName)<a name="line.1104"></a>
<span class="sourceLineNo">1105</span>      throws IOException {<a name="line.1105"></a>
<span class="sourceLineNo">1106</span>    if (tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.1106"></a>
<span class="sourceLineNo">1107</span>      return new TableState(tableName, TableState.State.ENABLED);<a name="line.1107"></a>
<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
<span class="sourceLineNo">1109</span>    Table metaHTable = getMetaHTable(conn);<a name="line.1109"></a>
<span class="sourceLineNo">1110</span>    Get get = new Get(tableName.getName()).addColumn(getTableFamily(), getTableStateColumn());<a name="line.1110"></a>
<span class="sourceLineNo">1111</span>    Result result = metaHTable.get(get);<a name="line.1111"></a>
<span class="sourceLineNo">1112</span>    return getTableState(result);<a name="line.1112"></a>
<span class="sourceLineNo">1113</span>  }<a name="line.1113"></a>
<span class="sourceLineNo">1114</span><a name="line.1114"></a>
<span class="sourceLineNo">1115</span>  /**<a name="line.1115"></a>
<span class="sourceLineNo">1116</span>   * Fetch table states from META table<a name="line.1116"></a>
<span class="sourceLineNo">1117</span>   * @param conn connection to use<a name="line.1117"></a>
<span class="sourceLineNo">1118</span>   * @return map {tableName -&amp;gt; state}<a name="line.1118"></a>
<span class="sourceLineNo">1119</span>   */<a name="line.1119"></a>
<span class="sourceLineNo">1120</span>  public static Map&lt;TableName, TableState&gt; getTableStates(Connection conn)<a name="line.1120"></a>
<span class="sourceLineNo">1121</span>      throws IOException {<a name="line.1121"></a>
<span class="sourceLineNo">1122</span>    final Map&lt;TableName, TableState&gt; states = new LinkedHashMap&lt;&gt;();<a name="line.1122"></a>
<span class="sourceLineNo">1123</span>    Visitor collector = r -&gt; {<a name="line.1123"></a>
<span class="sourceLineNo">1124</span>      TableState state = getTableState(r);<a name="line.1124"></a>
<span class="sourceLineNo">1125</span>      if (state != null) {<a name="line.1125"></a>
<span class="sourceLineNo">1126</span>        states.put(state.getTableName(), state);<a name="line.1126"></a>
<span class="sourceLineNo">1127</span>      }<a name="line.1127"></a>
<span class="sourceLineNo">1128</span>      return true;<a name="line.1128"></a>
<span class="sourceLineNo">1129</span>    };<a name="line.1129"></a>
<span class="sourceLineNo">1130</span>    fullScanTables(conn, collector);<a name="line.1130"></a>
<span class="sourceLineNo">1131</span>    return states;<a name="line.1131"></a>
<span class="sourceLineNo">1132</span>  }<a name="line.1132"></a>
<span class="sourceLineNo">1133</span><a name="line.1133"></a>
<span class="sourceLineNo">1134</span>  /**<a name="line.1134"></a>
<span class="sourceLineNo">1135</span>   * Updates state in META<a name="line.1135"></a>
<span class="sourceLineNo">1136</span>   * @param conn connection to use<a name="line.1136"></a>
<span class="sourceLineNo">1137</span>   * @param tableName table to look for<a name="line.1137"></a>
<span class="sourceLineNo">1138</span>   */<a name="line.1138"></a>
<span class="sourceLineNo">1139</span>  public static void updateTableState(Connection conn, TableName tableName,<a name="line.1139"></a>
<span class="sourceLineNo">1140</span>      TableState.State actual) throws IOException {<a name="line.1140"></a>
<span class="sourceLineNo">1141</span>    updateTableState(conn, new TableState(tableName, actual));<a name="line.1141"></a>
<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
<span class="sourceLineNo">1143</span><a name="line.1143"></a>
<span class="sourceLineNo">1144</span>  /**<a name="line.1144"></a>
<span class="sourceLineNo">1145</span>   * Decode table state from META Result.<a name="line.1145"></a>
<span class="sourceLineNo">1146</span>   * Should contain cell from HConstants.TABLE_FAMILY<a name="line.1146"></a>
<span class="sourceLineNo">1147</span>   * @return null if not found<a name="line.1147"></a>
<span class="sourceLineNo">1148</span>   */<a name="line.1148"></a>
<span class="sourceLineNo">1149</span>  @Nullable<a name="line.1149"></a>
<span class="sourceLineNo">1150</span>  public static TableState getTableState(Result r) throws IOException {<a name="line.1150"></a>
<span class="sourceLineNo">1151</span>    Cell cell = r.getColumnLatestCell(getTableFamily(), getTableStateColumn());<a name="line.1151"></a>
<span class="sourceLineNo">1152</span>    if (cell == null) {<a name="line.1152"></a>
<span class="sourceLineNo">1153</span>      return null;<a name="line.1153"></a>
<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
<span class="sourceLineNo">1155</span>    try {<a name="line.1155"></a>
<span class="sourceLineNo">1156</span>      return TableState.parseFrom(TableName.valueOf(r.getRow()),<a name="line.1156"></a>
<span class="sourceLineNo">1157</span>        Arrays.copyOfRange(cell.getValueArray(), cell.getValueOffset(),<a name="line.1157"></a>
<span class="sourceLineNo">1158</span>          cell.getValueOffset() + cell.getValueLength()));<a name="line.1158"></a>
<span class="sourceLineNo">1159</span>    } catch (DeserializationException e) {<a name="line.1159"></a>
<span class="sourceLineNo">1160</span>      throw new IOException(e);<a name="line.1160"></a>
<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
<span class="sourceLineNo">1162</span>  }<a name="line.1162"></a>
<span class="sourceLineNo">1163</span><a name="line.1163"></a>
<span class="sourceLineNo">1164</span>  /**<a name="line.1164"></a>
<span class="sourceLineNo">1165</span>   * Implementations 'visit' a catalog table row.<a name="line.1165"></a>
<span class="sourceLineNo">1166</span>   */<a name="line.1166"></a>
<span class="sourceLineNo">1167</span>  public interface Visitor {<a name="line.1167"></a>
<span class="sourceLineNo">1168</span>    /**<a name="line.1168"></a>
<span class="sourceLineNo">1169</span>     * Visit the catalog table row.<a name="line.1169"></a>
<span class="sourceLineNo">1170</span>     * @param r A row from catalog table<a name="line.1170"></a>
<span class="sourceLineNo">1171</span>     * @return True if we are to proceed scanning the table, else false if<a name="line.1171"></a>
<span class="sourceLineNo">1172</span>     * we are to stop now.<a name="line.1172"></a>
<span class="sourceLineNo">1173</span>     */<a name="line.1173"></a>
<span class="sourceLineNo">1174</span>    boolean visit(final Result r) throws IOException;<a name="line.1174"></a>
<span class="sourceLineNo">1175</span>  }<a name="line.1175"></a>
<span class="sourceLineNo">1176</span><a name="line.1176"></a>
<span class="sourceLineNo">1177</span>  /**<a name="line.1177"></a>
<span class="sourceLineNo">1178</span>   * Implementations 'visit' a catalog table row but with close() at the end.<a name="line.1178"></a>
<span class="sourceLineNo">1179</span>   */<a name="line.1179"></a>
<span class="sourceLineNo">1180</span>  public interface CloseableVisitor extends Visitor, Closeable {<a name="line.1180"></a>
<span class="sourceLineNo">1181</span>  }<a name="line.1181"></a>
<span class="sourceLineNo">1182</span><a name="line.1182"></a>
<span class="sourceLineNo">1183</span>  /**<a name="line.1183"></a>
<span class="sourceLineNo">1184</span>   * A {@link Visitor} that collects content out of passed {@link Result}.<a name="line.1184"></a>
<span class="sourceLineNo">1185</span>   */<a name="line.1185"></a>
<span class="sourceLineNo">1186</span>  static abstract class CollectingVisitor&lt;T&gt; implements Visitor {<a name="line.1186"></a>
<span class="sourceLineNo">1187</span>    final List&lt;T&gt; results = new ArrayList&lt;&gt;();<a name="line.1187"></a>
<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
<span class="sourceLineNo">1189</span>    public boolean visit(Result r) throws IOException {<a name="line.1189"></a>
<span class="sourceLineNo">1190</span>      if (r != null &amp;&amp; !r.isEmpty()) {<a name="line.1190"></a>
<span class="sourceLineNo">1191</span>        add(r);<a name="line.1191"></a>
<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
<span class="sourceLineNo">1193</span>      return true;<a name="line.1193"></a>
<span class="sourceLineNo">1194</span>    }<a name="line.1194"></a>
<span class="sourceLineNo">1195</span><a name="line.1195"></a>
<span class="sourceLineNo">1196</span>    abstract void add(Result r);<a name="line.1196"></a>
<span class="sourceLineNo">1197</span><a name="line.1197"></a>
<span class="sourceLineNo">1198</span>    /**<a name="line.1198"></a>
<span class="sourceLineNo">1199</span>     * @return Collected results; wait till visits complete to collect all<a name="line.1199"></a>
<span class="sourceLineNo">1200</span>     * possible results<a name="line.1200"></a>
<span class="sourceLineNo">1201</span>     */<a name="line.1201"></a>
<span class="sourceLineNo">1202</span>    List&lt;T&gt; getResults() {<a name="line.1202"></a>
<span class="sourceLineNo">1203</span>      return this.results;<a name="line.1203"></a>
<span class="sourceLineNo">1204</span>    }<a name="line.1204"></a>
<span class="sourceLineNo">1205</span>  }<a name="line.1205"></a>
<span class="sourceLineNo">1206</span><a name="line.1206"></a>
<span class="sourceLineNo">1207</span>  /**<a name="line.1207"></a>
<span class="sourceLineNo">1208</span>   * Collects all returned.<a name="line.1208"></a>
<span class="sourceLineNo">1209</span>   */<a name="line.1209"></a>
<span class="sourceLineNo">1210</span>  static class CollectAllVisitor extends CollectingVisitor&lt;Result&gt; {<a name="line.1210"></a>
<span class="sourceLineNo">1211</span>    @Override<a name="line.1211"></a>
<span class="sourceLineNo">1212</span>    void add(Result r) {<a name="line.1212"></a>
<span class="sourceLineNo">1213</span>      this.results.add(r);<a name="line.1213"></a>
<span class="sourceLineNo">1214</span>    }<a name="line.1214"></a>
<span class="sourceLineNo">1215</span>  }<a name="line.1215"></a>
<span class="sourceLineNo">1216</span><a name="line.1216"></a>
<span class="sourceLineNo">1217</span>  /**<a name="line.1217"></a>
<span class="sourceLineNo">1218</span>   * A Visitor that skips offline regions and split parents<a name="line.1218"></a>
<span class="sourceLineNo">1219</span>   */<a name="line.1219"></a>
<span class="sourceLineNo">1220</span>  public static abstract class DefaultVisitorBase implements Visitor {<a name="line.1220"></a>
<span class="sourceLineNo">1221</span><a name="line.1221"></a>
<span class="sourceLineNo">1222</span>    DefaultVisitorBase() {<a name="line.1222"></a>
<span class="sourceLineNo">1223</span>      super();<a name="line.1223"></a>
<span class="sourceLineNo">1224</span>    }<a name="line.1224"></a>
<span class="sourceLineNo">1225</span><a name="line.1225"></a>
<span class="sourceLineNo">1226</span>    public abstract boolean visitInternal(Result rowResult) throws IOException;<a name="line.1226"></a>
<span class="sourceLineNo">1227</span><a name="line.1227"></a>
<span class="sourceLineNo">1228</span>    @Override<a name="line.1228"></a>
<span class="sourceLineNo">1229</span>    public boolean visit(Result rowResult) throws IOException {<a name="line.1229"></a>
<span class="sourceLineNo">1230</span>      RegionInfo info = getRegionInfo(rowResult);<a name="line.1230"></a>
<span class="sourceLineNo">1231</span>      if (info == null) {<a name="line.1231"></a>
<span class="sourceLineNo">1232</span>        return true;<a name="line.1232"></a>
<span class="sourceLineNo">1233</span>      }<a name="line.1233"></a>
<span class="sourceLineNo">1234</span><a name="line.1234"></a>
<span class="sourceLineNo">1235</span>      //skip over offline and split regions<a name="line.1235"></a>
<span class="sourceLineNo">1236</span>      if (!(info.isOffline() || info.isSplit())) {<a name="line.1236"></a>
<span class="sourceLineNo">1237</span>        return visitInternal(rowResult);<a name="line.1237"></a>
<span class="sourceLineNo">1238</span>      }<a name="line.1238"></a>
<span class="sourceLineNo">1239</span>      return true;<a name="line.1239"></a>
<span class="sourceLineNo">1240</span>    }<a name="line.1240"></a>
<span class="sourceLineNo">1241</span>  }<a name="line.1241"></a>
<span class="sourceLineNo">1242</span><a name="line.1242"></a>
<span class="sourceLineNo">1243</span>  /**<a name="line.1243"></a>
<span class="sourceLineNo">1244</span>   * Count regions in &lt;code&gt;hbase:meta&lt;/code&gt; for passed table.<a name="line.1244"></a>
<span class="sourceLineNo">1245</span>   * @param c Configuration object<a name="line.1245"></a>
<span class="sourceLineNo">1246</span>   * @param tableName table name to count regions for<a name="line.1246"></a>
<span class="sourceLineNo">1247</span>   * @return Count or regions in table &lt;code&gt;tableName&lt;/code&gt;<a name="line.1247"></a>
<span class="sourceLineNo">1248</span>   */<a name="line.1248"></a>
<span class="sourceLineNo">1249</span>  public static int getRegionCount(final Configuration c, final TableName tableName)<a name="line.1249"></a>
<span class="sourceLineNo">1250</span>      throws IOException {<a name="line.1250"></a>
<span class="sourceLineNo">1251</span>    try (Connection connection = ConnectionFactory.createConnection(c)) {<a name="line.1251"></a>
<span class="sourceLineNo">1252</span>      return getRegionCount(connection, tableName);<a name="line.1252"></a>
<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
<span class="sourceLineNo">1254</span>  }<a name="line.1254"></a>
<span class="sourceLineNo">1255</span><a name="line.1255"></a>
<span class="sourceLineNo">1256</span>  /**<a name="line.1256"></a>
<span class="sourceLineNo">1257</span>   * Count regions in &lt;code&gt;hbase:meta&lt;/code&gt; for passed table.<a name="line.1257"></a>
<span class="sourceLineNo">1258</span>   * @param connection Connection object<a name="line.1258"></a>
<span class="sourceLineNo">1259</span>   * @param tableName table name to count regions for<a name="line.1259"></a>
<span class="sourceLineNo">1260</span>   * @return Count or regions in table &lt;code&gt;tableName&lt;/code&gt;<a name="line.1260"></a>
<span class="sourceLineNo">1261</span>   */<a name="line.1261"></a>
<span class="sourceLineNo">1262</span>  public static int getRegionCount(final Connection connection, final TableName tableName)<a name="line.1262"></a>
<span class="sourceLineNo">1263</span>      throws IOException {<a name="line.1263"></a>
<span class="sourceLineNo">1264</span>    try (RegionLocator locator = connection.getRegionLocator(tableName)) {<a name="line.1264"></a>
<span class="sourceLineNo">1265</span>      List&lt;HRegionLocation&gt; locations = locator.getAllRegionLocations();<a name="line.1265"></a>
<span class="sourceLineNo">1266</span>      return locations == null ? 0 : locations.size();<a name="line.1266"></a>
<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
<span class="sourceLineNo">1268</span>  }<a name="line.1268"></a>
<span class="sourceLineNo">1269</span><a name="line.1269"></a>
<span class="sourceLineNo">1270</span>  ////////////////////////<a name="line.1270"></a>
<span class="sourceLineNo">1271</span>  // Editing operations //<a name="line.1271"></a>
<span class="sourceLineNo">1272</span>  ////////////////////////<a name="line.1272"></a>
<span class="sourceLineNo">1273</span>  /**<a name="line.1273"></a>
<span class="sourceLineNo">1274</span>   * Generates and returns a Put containing the region into for the catalog table<a name="line.1274"></a>
<span class="sourceLineNo">1275</span>   */<a name="line.1275"></a>
<span class="sourceLineNo">1276</span>  public static Put makePutFromRegionInfo(RegionInfo regionInfo, long ts) throws IOException {<a name="line.1276"></a>
<span class="sourceLineNo">1277</span>    Put put = new Put(regionInfo.getRegionName(), ts);<a name="line.1277"></a>
<span class="sourceLineNo">1278</span>    addRegionInfo(put, regionInfo);<a name="line.1278"></a>
<span class="sourceLineNo">1279</span>    return put;<a name="line.1279"></a>
<span class="sourceLineNo">1280</span>  }<a name="line.1280"></a>
<span class="sourceLineNo">1281</span><a name="line.1281"></a>
<span class="sourceLineNo">1282</span>  /**<a name="line.1282"></a>
<span class="sourceLineNo">1283</span>   * Generates and returns a Delete containing the region info for the catalog table<a name="line.1283"></a>
<span class="sourceLineNo">1284</span>   */<a name="line.1284"></a>
<span class="sourceLineNo">1285</span>  private static Delete makeDeleteFromRegionInfo(RegionInfo regionInfo, long ts) {<a name="line.1285"></a>
<span class="sourceLineNo">1286</span>    if (regionInfo == null) {<a name="line.1286"></a>
<span class="sourceLineNo">1287</span>      throw new IllegalArgumentException("Can't make a delete for null region");<a name="line.1287"></a>
<span class="sourceLineNo">1288</span>    }<a name="line.1288"></a>
<span class="sourceLineNo">1289</span>    Delete delete = new Delete(regionInfo.getRegionName());<a name="line.1289"></a>
<span class="sourceLineNo">1290</span>    delete.addFamily(getCatalogFamily(), ts);<a name="line.1290"></a>
<span class="sourceLineNo">1291</span>    return delete;<a name="line.1291"></a>
<span class="sourceLineNo">1292</span>  }<a name="line.1292"></a>
<span class="sourceLineNo">1293</span><a name="line.1293"></a>
<span class="sourceLineNo">1294</span>  /**<a name="line.1294"></a>
<span class="sourceLineNo">1295</span>   * Adds split daughters to the Put<a name="line.1295"></a>
<span class="sourceLineNo">1296</span>   */<a name="line.1296"></a>
<span class="sourceLineNo">1297</span>  private static Put addDaughtersToPut(Put put, RegionInfo splitA, RegionInfo splitB)<a name="line.1297"></a>
<span class="sourceLineNo">1298</span>      throws IOException {<a name="line.1298"></a>
<span class="sourceLineNo">1299</span>    if (splitA != null) {<a name="line.1299"></a>
<span class="sourceLineNo">1300</span>      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.1300"></a>
<span class="sourceLineNo">1301</span>                .setRow(put.getRow())<a name="line.1301"></a>
<span class="sourceLineNo">1302</span>                .setFamily(HConstants.CATALOG_FAMILY)<a name="line.1302"></a>
<span class="sourceLineNo">1303</span>                .setQualifier(HConstants.SPLITA_QUALIFIER)<a name="line.1303"></a>
<span class="sourceLineNo">1304</span>                .setTimestamp(put.getTimestamp())<a name="line.1304"></a>
<span class="sourceLineNo">1305</span>                .setType(Type.Put)<a name="line.1305"></a>
<span class="sourceLineNo">1306</span>                .setValue(RegionInfo.toByteArray(splitA))<a name="line.1306"></a>
<span class="sourceLineNo">1307</span>                .build());<a name="line.1307"></a>
<span class="sourceLineNo">1308</span>    }<a name="line.1308"></a>
<span class="sourceLineNo">1309</span>    if (splitB != null) {<a name="line.1309"></a>
<span class="sourceLineNo">1310</span>      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.1310"></a>
<span class="sourceLineNo">1311</span>                .setRow(put.getRow())<a name="line.1311"></a>
<span class="sourceLineNo">1312</span>                .setFamily(HConstants.CATALOG_FAMILY)<a name="line.1312"></a>
<span class="sourceLineNo">1313</span>                .setQualifier(HConstants.SPLITB_QUALIFIER)<a name="line.1313"></a>
<span class="sourceLineNo">1314</span>                .setTimestamp(put.getTimestamp())<a name="line.1314"></a>
<span class="sourceLineNo">1315</span>                .setType(Type.Put)<a name="line.1315"></a>
<span class="sourceLineNo">1316</span>                .setValue(RegionInfo.toByteArray(splitB))<a name="line.1316"></a>
<span class="sourceLineNo">1317</span>                .build());<a name="line.1317"></a>
<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
<span class="sourceLineNo">1319</span>    return put;<a name="line.1319"></a>
<span class="sourceLineNo">1320</span>  }<a name="line.1320"></a>
<span class="sourceLineNo">1321</span><a name="line.1321"></a>
<span class="sourceLineNo">1322</span>  /**<a name="line.1322"></a>
<span class="sourceLineNo">1323</span>   * Put the passed &lt;code&gt;p&lt;/code&gt; to the &lt;code&gt;hbase:meta&lt;/code&gt; table.<a name="line.1323"></a>
<span class="sourceLineNo">1324</span>   * @param connection connection we're using<a name="line.1324"></a>
<span class="sourceLineNo">1325</span>   * @param p Put to add to hbase:meta<a name="line.1325"></a>
<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
<span class="sourceLineNo">1327</span>  private static void putToMetaTable(Connection connection, Put p) throws IOException {<a name="line.1327"></a>
<span class="sourceLineNo">1328</span>    try (Table table = getMetaHTable(connection)) {<a name="line.1328"></a>
<span class="sourceLineNo">1329</span>      put(table, p);<a name="line.1329"></a>
<span class="sourceLineNo">1330</span>    }<a name="line.1330"></a>
<span class="sourceLineNo">1331</span>  }<a name="line.1331"></a>
<span class="sourceLineNo">1332</span><a name="line.1332"></a>
<span class="sourceLineNo">1333</span>  /**<a name="line.1333"></a>
<span class="sourceLineNo">1334</span>   * @param t Table to use<a name="line.1334"></a>
<span class="sourceLineNo">1335</span>   * @param p put to make<a name="line.1335"></a>
<span class="sourceLineNo">1336</span>   */<a name="line.1336"></a>
<span class="sourceLineNo">1337</span>  private static void put(Table t, Put p) throws IOException {<a name="line.1337"></a>
<span class="sourceLineNo">1338</span>    debugLogMutation(p);<a name="line.1338"></a>
<span class="sourceLineNo">1339</span>    t.put(p);<a name="line.1339"></a>
<span class="sourceLineNo">1340</span>  }<a name="line.1340"></a>
<span class="sourceLineNo">1341</span><a name="line.1341"></a>
<span class="sourceLineNo">1342</span>  /**<a name="line.1342"></a>
<span class="sourceLineNo">1343</span>   * Put the passed &lt;code&gt;ps&lt;/code&gt; to the &lt;code&gt;hbase:meta&lt;/code&gt; table.<a name="line.1343"></a>
<span class="sourceLineNo">1344</span>   * @param connection connection we're using<a name="line.1344"></a>
<span class="sourceLineNo">1345</span>   * @param ps Put to add to hbase:meta<a name="line.1345"></a>
<span class="sourceLineNo">1346</span>   */<a name="line.1346"></a>
<span class="sourceLineNo">1347</span>  public static void putsToMetaTable(final Connection connection, final List&lt;Put&gt; ps)<a name="line.1347"></a>
<span class="sourceLineNo">1348</span>      throws IOException {<a name="line.1348"></a>
<span class="sourceLineNo">1349</span>    if (ps.isEmpty()) {<a name="line.1349"></a>
<span class="sourceLineNo">1350</span>      return;<a name="line.1350"></a>
<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
<span class="sourceLineNo">1352</span>    try (Table t = getMetaHTable(connection)) {<a name="line.1352"></a>
<span class="sourceLineNo">1353</span>      debugLogMutations(ps);<a name="line.1353"></a>
<span class="sourceLineNo">1354</span>      // the implementation for putting a single Put is much simpler so here we do a check first.<a name="line.1354"></a>
<span class="sourceLineNo">1355</span>      if (ps.size() == 1) {<a name="line.1355"></a>
<span class="sourceLineNo">1356</span>        t.put(ps.get(0));<a name="line.1356"></a>
<span class="sourceLineNo">1357</span>      } else {<a name="line.1357"></a>
<span class="sourceLineNo">1358</span>        t.put(ps);<a name="line.1358"></a>
<span class="sourceLineNo">1359</span>      }<a name="line.1359"></a>
<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
<span class="sourceLineNo">1361</span>  }<a name="line.1361"></a>
<span class="sourceLineNo">1362</span><a name="line.1362"></a>
<span class="sourceLineNo">1363</span>  /**<a name="line.1363"></a>
<span class="sourceLineNo">1364</span>   * Delete the passed &lt;code&gt;d&lt;/code&gt; from the &lt;code&gt;hbase:meta&lt;/code&gt; table.<a name="line.1364"></a>
<span class="sourceLineNo">1365</span>   * @param connection connection we're using<a name="line.1365"></a>
<span class="sourceLineNo">1366</span>   * @param d Delete to add to hbase:meta<a name="line.1366"></a>
<span class="sourceLineNo">1367</span>   */<a name="line.1367"></a>
<span class="sourceLineNo">1368</span>  private static void deleteFromMetaTable(final Connection connection, final Delete d)<a name="line.1368"></a>
<span class="sourceLineNo">1369</span>      throws IOException {<a name="line.1369"></a>
<span class="sourceLineNo">1370</span>    List&lt;Delete&gt; dels = new ArrayList&lt;&gt;(1);<a name="line.1370"></a>
<span class="sourceLineNo">1371</span>    dels.add(d);<a name="line.1371"></a>
<span class="sourceLineNo">1372</span>    deleteFromMetaTable(connection, dels);<a name="line.1372"></a>
<span class="sourceLineNo">1373</span>  }<a name="line.1373"></a>
<span class="sourceLineNo">1374</span><a name="line.1374"></a>
<span class="sourceLineNo">1375</span>  /**<a name="line.1375"></a>
<span class="sourceLineNo">1376</span>   * Delete the passed &lt;code&gt;deletes&lt;/code&gt; from the &lt;code&gt;hbase:meta&lt;/code&gt; table.<a name="line.1376"></a>
<span class="sourceLineNo">1377</span>   * @param connection connection we're using<a name="line.1377"></a>
<span class="sourceLineNo">1378</span>   * @param deletes Deletes to add to hbase:meta  This list should support #remove.<a name="line.1378"></a>
<span class="sourceLineNo">1379</span>   */<a name="line.1379"></a>
<span class="sourceLineNo">1380</span>  private static void deleteFromMetaTable(final Connection connection, final List&lt;Delete&gt; deletes)<a name="line.1380"></a>
<span class="sourceLineNo">1381</span>      throws IOException {<a name="line.1381"></a>
<span class="sourceLineNo">1382</span>    try (Table t = getMetaHTable(connection)) {<a name="line.1382"></a>
<span class="sourceLineNo">1383</span>      debugLogMutations(deletes);<a name="line.1383"></a>
<span class="sourceLineNo">1384</span>      t.delete(deletes);<a name="line.1384"></a>
<span class="sourceLineNo">1385</span>    }<a name="line.1385"></a>
<span class="sourceLineNo">1386</span>  }<a name="line.1386"></a>
<span class="sourceLineNo">1387</span><a name="line.1387"></a>
<span class="sourceLineNo">1388</span>  /**<a name="line.1388"></a>
<span class="sourceLineNo">1389</span>   * Deletes some replica columns corresponding to replicas for the passed rows<a name="line.1389"></a>
<span class="sourceLineNo">1390</span>   * @param metaRows rows in hbase:meta<a name="line.1390"></a>
<span class="sourceLineNo">1391</span>   * @param replicaIndexToDeleteFrom the replica ID we would start deleting from<a name="line.1391"></a>
<span class="sourceLineNo">1392</span>   * @param numReplicasToRemove how many replicas to remove<a name="line.1392"></a>
<span class="sourceLineNo">1393</span>   * @param connection connection we're using to access meta table<a name="line.1393"></a>
<span class="sourceLineNo">1394</span>   */<a name="line.1394"></a>
<span class="sourceLineNo">1395</span>  public static void removeRegionReplicasFromMeta(Set&lt;byte[]&gt; metaRows,<a name="line.1395"></a>
<span class="sourceLineNo">1396</span>    int replicaIndexToDeleteFrom, int numReplicasToRemove, Connection connection)<a name="line.1396"></a>
<span class="sourceLineNo">1397</span>      throws IOException {<a name="line.1397"></a>
<span class="sourceLineNo">1398</span>    int absoluteIndex = replicaIndexToDeleteFrom + numReplicasToRemove;<a name="line.1398"></a>
<span class="sourceLineNo">1399</span>    for (byte[] row : metaRows) {<a name="line.1399"></a>
<span class="sourceLineNo">1400</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.1400"></a>
<span class="sourceLineNo">1401</span>      Delete deleteReplicaLocations = new Delete(row);<a name="line.1401"></a>
<span class="sourceLineNo">1402</span>      for (int i = replicaIndexToDeleteFrom; i &lt; absoluteIndex; i++) {<a name="line.1402"></a>
<span class="sourceLineNo">1403</span>        deleteReplicaLocations.addColumns(getCatalogFamily(),<a name="line.1403"></a>
<span class="sourceLineNo">1404</span>          getServerColumn(i), now);<a name="line.1404"></a>
<span class="sourceLineNo">1405</span>        deleteReplicaLocations.addColumns(getCatalogFamily(),<a name="line.1405"></a>
<span class="sourceLineNo">1406</span>          getSeqNumColumn(i), now);<a name="line.1406"></a>
<span class="sourceLineNo">1407</span>        deleteReplicaLocations.addColumns(getCatalogFamily(),<a name="line.1407"></a>
<span class="sourceLineNo">1408</span>          getStartCodeColumn(i), now);<a name="line.1408"></a>
<span class="sourceLineNo">1409</span>        deleteReplicaLocations.addColumns(getCatalogFamily(), getServerNameColumn(i), now);<a name="line.1409"></a>
<span class="sourceLineNo">1410</span>        deleteReplicaLocations.addColumns(getCatalogFamily(), getRegionStateColumn(i), now);<a name="line.1410"></a>
<span class="sourceLineNo">1411</span>      }<a name="line.1411"></a>
<span class="sourceLineNo">1412</span><a name="line.1412"></a>
<span class="sourceLineNo">1413</span>      deleteFromMetaTable(connection, deleteReplicaLocations);<a name="line.1413"></a>
<span class="sourceLineNo">1414</span>    }<a name="line.1414"></a>
<span class="sourceLineNo">1415</span>  }<a name="line.1415"></a>
<span class="sourceLineNo">1416</span><a name="line.1416"></a>
<span class="sourceLineNo">1417</span>  private static void addRegionStateToPut(Put put, RegionState.State state) throws IOException {<a name="line.1417"></a>
<span class="sourceLineNo">1418</span>    put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.1418"></a>
<span class="sourceLineNo">1419</span>        .setRow(put.getRow())<a name="line.1419"></a>
<span class="sourceLineNo">1420</span>        .setFamily(HConstants.CATALOG_FAMILY)<a name="line.1420"></a>
<span class="sourceLineNo">1421</span>        .setQualifier(getRegionStateColumn())<a name="line.1421"></a>
<span class="sourceLineNo">1422</span>        .setTimestamp(put.getTimestamp())<a name="line.1422"></a>
<span class="sourceLineNo">1423</span>        .setType(Cell.Type.Put)<a name="line.1423"></a>
<span class="sourceLineNo">1424</span>        .setValue(Bytes.toBytes(state.name()))<a name="line.1424"></a>
<span class="sourceLineNo">1425</span>        .build());<a name="line.1425"></a>
<span class="sourceLineNo">1426</span>  }<a name="line.1426"></a>
<span class="sourceLineNo">1427</span><a name="line.1427"></a>
<span class="sourceLineNo">1428</span>  /**<a name="line.1428"></a>
<span class="sourceLineNo">1429</span>   * Adds daughter region infos to hbase:meta row for the specified region. Note that this does not<a name="line.1429"></a>
<span class="sourceLineNo">1430</span>   * add its daughter's as different rows, but adds information about the daughters in the same row<a name="line.1430"></a>
<span class="sourceLineNo">1431</span>   * as the parent. Use<a name="line.1431"></a>
<span class="sourceLineNo">1432</span>   * {@link #splitRegion(Connection, RegionInfo, long, RegionInfo, RegionInfo, ServerName, int)}<a name="line.1432"></a>
<span class="sourceLineNo">1433</span>   * if you want to do that.<a name="line.1433"></a>
<span class="sourceLineNo">1434</span>   * @param connection connection we're using<a name="line.1434"></a>
<span class="sourceLineNo">1435</span>   * @param regionInfo RegionInfo of parent region<a name="line.1435"></a>
<span class="sourceLineNo">1436</span>   * @param splitA first split daughter of the parent regionInfo<a name="line.1436"></a>
<span class="sourceLineNo">1437</span>   * @param splitB second split daughter of the parent regionInfo<a name="line.1437"></a>
<span class="sourceLineNo">1438</span>   * @throws IOException if problem connecting or updating meta<a name="line.1438"></a>
<span class="sourceLineNo">1439</span>   */<a name="line.1439"></a>
<span class="sourceLineNo">1440</span>  public static void addSplitsToParent(Connection connection, RegionInfo regionInfo,<a name="line.1440"></a>
<span class="sourceLineNo">1441</span>      RegionInfo splitA, RegionInfo splitB) throws IOException {<a name="line.1441"></a>
<span class="sourceLineNo">1442</span>    try (Table meta = getMetaHTable(connection)) {<a name="line.1442"></a>
<span class="sourceLineNo">1443</span>      Put put = makePutFromRegionInfo(regionInfo, EnvironmentEdgeManager.currentTime());<a name="line.1443"></a>
<span class="sourceLineNo">1444</span>      addDaughtersToPut(put, splitA, splitB);<a name="line.1444"></a>
<span class="sourceLineNo">1445</span>      meta.put(put);<a name="line.1445"></a>
<span class="sourceLineNo">1446</span>      debugLogMutation(put);<a name="line.1446"></a>
<span class="sourceLineNo">1447</span>      LOG.debug("Added region {}", regionInfo.getRegionNameAsString());<a name="line.1447"></a>
<span class="sourceLineNo">1448</span>    }<a name="line.1448"></a>
<span class="sourceLineNo">1449</span>  }<a name="line.1449"></a>
<span class="sourceLineNo">1450</span><a name="line.1450"></a>
<span class="sourceLineNo">1451</span>  /**<a name="line.1451"></a>
<span class="sourceLineNo">1452</span>   * Adds a (single) hbase:meta row for the specified new region and its daughters. Note that this<a name="line.1452"></a>
<span class="sourceLineNo">1453</span>   * does not add its daughter's as different rows, but adds information about the daughters<a name="line.1453"></a>
<span class="sourceLineNo">1454</span>   * in the same row as the parent. Use<a name="line.1454"></a>
<span class="sourceLineNo">1455</span>   * {@link #splitRegion(Connection, RegionInfo, long, RegionInfo, RegionInfo, ServerName, int)}<a name="line.1455"></a>
<span class="sourceLineNo">1456</span>   * if you want to do that.<a name="line.1456"></a>
<span class="sourceLineNo">1457</span>   * @param connection connection we're using<a name="line.1457"></a>
<span class="sourceLineNo">1458</span>   * @param regionInfo region information<a name="line.1458"></a>
<span class="sourceLineNo">1459</span>   * @throws IOException if problem connecting or updating meta<a name="line.1459"></a>
<span class="sourceLineNo">1460</span>   */<a name="line.1460"></a>
<span class="sourceLineNo">1461</span>  @VisibleForTesting<a name="line.1461"></a>
<span class="sourceLineNo">1462</span>  public static void addRegionToMeta(Connection connection, RegionInfo regionInfo)<a name="line.1462"></a>
<span class="sourceLineNo">1463</span>      throws IOException {<a name="line.1463"></a>
<span class="sourceLineNo">1464</span>    addRegionsToMeta(connection, Collections.singletonList(regionInfo), 1);<a name="line.1464"></a>
<span class="sourceLineNo">1465</span>  }<a name="line.1465"></a>
<span class="sourceLineNo">1466</span><a name="line.1466"></a>
<span class="sourceLineNo">1467</span>  /**<a name="line.1467"></a>
<span class="sourceLineNo">1468</span>   * Adds a hbase:meta row for each of the specified new regions. Initial state for new regions<a name="line.1468"></a>
<span class="sourceLineNo">1469</span>   * is CLOSED.<a name="line.1469"></a>
<span class="sourceLineNo">1470</span>   * @param connection connection we're using<a name="line.1470"></a>
<span class="sourceLineNo">1471</span>   * @param regionInfos region information list<a name="line.1471"></a>
<span class="sourceLineNo">1472</span>   * @throws IOException if problem connecting or updating meta<a name="line.1472"></a>
<span class="sourceLineNo">1473</span>   */<a name="line.1473"></a>
<span class="sourceLineNo">1474</span>  public static void addRegionsToMeta(Connection connection, List&lt;RegionInfo&gt; regionInfos,<a name="line.1474"></a>
<span class="sourceLineNo">1475</span>      int regionReplication) throws IOException {<a name="line.1475"></a>
<span class="sourceLineNo">1476</span>    addRegionsToMeta(connection, regionInfos, regionReplication,<a name="line.1476"></a>
<span class="sourceLineNo">1477</span>      EnvironmentEdgeManager.currentTime());<a name="line.1477"></a>
<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
<span class="sourceLineNo">1479</span><a name="line.1479"></a>
<span class="sourceLineNo">1480</span>  /**<a name="line.1480"></a>
<span class="sourceLineNo">1481</span>   * Adds a hbase:meta row for each of the specified new regions. Initial state for new regions<a name="line.1481"></a>
<span class="sourceLineNo">1482</span>   * is CLOSED.<a name="line.1482"></a>
<span class="sourceLineNo">1483</span>   * @param connection connection we're using<a name="line.1483"></a>
<span class="sourceLineNo">1484</span>   * @param regionInfos region information list<a name="line.1484"></a>
<span class="sourceLineNo">1485</span>   * @param ts desired timestamp<a name="line.1485"></a>
<span class="sourceLineNo">1486</span>   * @throws IOException if problem connecting or updating meta<a name="line.1486"></a>
<span class="sourceLineNo">1487</span>   */<a name="line.1487"></a>
<span class="sourceLineNo">1488</span>  private static void addRegionsToMeta(Connection connection, List&lt;RegionInfo&gt; regionInfos,<a name="line.1488"></a>
<span class="sourceLineNo">1489</span>      int regionReplication, long ts) throws IOException {<a name="line.1489"></a>
<span class="sourceLineNo">1490</span>    List&lt;Put&gt; puts = new ArrayList&lt;&gt;();<a name="line.1490"></a>
<span class="sourceLineNo">1491</span>    for (RegionInfo regionInfo : regionInfos) {<a name="line.1491"></a>
<span class="sourceLineNo">1492</span>      if (RegionReplicaUtil.isDefaultReplica(regionInfo)) {<a name="line.1492"></a>
<span class="sourceLineNo">1493</span>        Put put = makePutFromRegionInfo(regionInfo, ts);<a name="line.1493"></a>
<span class="sourceLineNo">1494</span>        // New regions are added with initial state of CLOSED.<a name="line.1494"></a>
<span class="sourceLineNo">1495</span>        addRegionStateToPut(put, RegionState.State.CLOSED);<a name="line.1495"></a>
<span class="sourceLineNo">1496</span>        // Add empty locations for region replicas so that number of replicas can be cached<a name="line.1496"></a>
<span class="sourceLineNo">1497</span>        // whenever the primary region is looked up from meta<a name="line.1497"></a>
<span class="sourceLineNo">1498</span>        for (int i = 1; i &lt; regionReplication; i++) {<a name="line.1498"></a>
<span class="sourceLineNo">1499</span>          addEmptyLocation(put, i);<a name="line.1499"></a>
<span class="sourceLineNo">1500</span>        }<a name="line.1500"></a>
<span class="sourceLineNo">1501</span>        puts.add(put);<a name="line.1501"></a>
<span class="sourceLineNo">1502</span>      }<a name="line.1502"></a>
<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
<span class="sourceLineNo">1504</span>    putsToMetaTable(connection, puts);<a name="line.1504"></a>
<span class="sourceLineNo">1505</span>    LOG.info("Added {} regions to meta.", puts.size());<a name="line.1505"></a>
<span class="sourceLineNo">1506</span>  }<a name="line.1506"></a>
<span class="sourceLineNo">1507</span><a name="line.1507"></a>
<span class="sourceLineNo">1508</span>  static Put addMergeRegions(Put put, Collection&lt;RegionInfo&gt; mergeRegions) throws IOException {<a name="line.1508"></a>
<span class="sourceLineNo">1509</span>    int limit = 10000; // Arbitrary limit. No room in our formatted 'task0000' below for more.<a name="line.1509"></a>
<span class="sourceLineNo">1510</span>    int max = mergeRegions.size();<a name="line.1510"></a>
<span class="sourceLineNo">1511</span>    if (max &gt; limit) {<a name="line.1511"></a>
<span class="sourceLineNo">1512</span>      // Should never happen!!!!! But just in case.<a name="line.1512"></a>
<span class="sourceLineNo">1513</span>      throw new RuntimeException("Can't merge " + max + " regions in one go; " + limit +<a name="line.1513"></a>
<span class="sourceLineNo">1514</span>          " is upper-limit.");<a name="line.1514"></a>
<span class="sourceLineNo">1515</span>    }<a name="line.1515"></a>
<span class="sourceLineNo">1516</span>    int counter = 0;<a name="line.1516"></a>
<span class="sourceLineNo">1517</span>    for (RegionInfo ri: mergeRegions) {<a name="line.1517"></a>
<span class="sourceLineNo">1518</span>      String qualifier = String.format(HConstants.MERGE_QUALIFIER_PREFIX_STR + "%04d", counter++);<a name="line.1518"></a>
<span class="sourceLineNo">1519</span>      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY).<a name="line.1519"></a>
<span class="sourceLineNo">1520</span>          setRow(put.getRow()).<a name="line.1520"></a>
<span class="sourceLineNo">1521</span>          setFamily(HConstants.CATALOG_FAMILY).<a name="line.1521"></a>
<span class="sourceLineNo">1522</span>          setQualifier(Bytes.toBytes(qualifier)).<a name="line.1522"></a>
<span class="sourceLineNo">1523</span>          setTimestamp(put.getTimestamp()).<a name="line.1523"></a>
<span class="sourceLineNo">1524</span>          setType(Type.Put).<a name="line.1524"></a>
<span class="sourceLineNo">1525</span>          setValue(RegionInfo.toByteArray(ri)).<a name="line.1525"></a>
<span class="sourceLineNo">1526</span>          build());<a name="line.1526"></a>
<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
<span class="sourceLineNo">1528</span>    return put;<a name="line.1528"></a>
<span class="sourceLineNo">1529</span>  }<a name="line.1529"></a>
<span class="sourceLineNo">1530</span><a name="line.1530"></a>
<span class="sourceLineNo">1531</span>  /**<a name="line.1531"></a>
<span class="sourceLineNo">1532</span>   * Merge regions into one in an atomic operation. Deletes the merging regions in<a name="line.1532"></a>
<span class="sourceLineNo">1533</span>   * hbase:meta and adds the merged region.<a name="line.1533"></a>
<span class="sourceLineNo">1534</span>   * @param connection connection we're using<a name="line.1534"></a>
<span class="sourceLineNo">1535</span>   * @param mergedRegion the merged region<a name="line.1535"></a>
<span class="sourceLineNo">1536</span>   * @param parentSeqNum Parent regions to merge and their next open sequence id used<a name="line.1536"></a>
<span class="sourceLineNo">1537</span>   *   by serial replication. Set to -1 if not needed by this table.<a name="line.1537"></a>
<span class="sourceLineNo">1538</span>   * @param sn the location of the region<a name="line.1538"></a>
<span class="sourceLineNo">1539</span>   */<a name="line.1539"></a>
<span class="sourceLineNo">1540</span>  public static void mergeRegions(Connection connection, RegionInfo mergedRegion,<a name="line.1540"></a>
<span class="sourceLineNo">1541</span>        Map&lt;RegionInfo, Long&gt; parentSeqNum, ServerName sn, int regionReplication)<a name="line.1541"></a>
<span class="sourceLineNo">1542</span>      throws IOException {<a name="line.1542"></a>
<span class="sourceLineNo">1543</span>    try (Table meta = getMetaHTable(connection)) {<a name="line.1543"></a>
<span class="sourceLineNo">1544</span>      long time = HConstants.LATEST_TIMESTAMP;<a name="line.1544"></a>
<span class="sourceLineNo">1545</span>      List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;();<a name="line.1545"></a>
<span class="sourceLineNo">1546</span>      List&lt;RegionInfo&gt; replicationParents = new ArrayList&lt;&gt;();<a name="line.1546"></a>
<span class="sourceLineNo">1547</span>      for (Map.Entry&lt;RegionInfo, Long&gt; e: parentSeqNum.entrySet()) {<a name="line.1547"></a>
<span class="sourceLineNo">1548</span>        RegionInfo ri = e.getKey();<a name="line.1548"></a>
<span class="sourceLineNo">1549</span>        long seqNum = e.getValue();<a name="line.1549"></a>
<span class="sourceLineNo">1550</span>        // Deletes for merging regions<a name="line.1550"></a>
<span class="sourceLineNo">1551</span>        mutations.add(makeDeleteFromRegionInfo(ri, time));<a name="line.1551"></a>
<span class="sourceLineNo">1552</span>        if (seqNum &gt; 0) {<a name="line.1552"></a>
<span class="sourceLineNo">1553</span>          mutations.add(makePutForReplicationBarrier(ri, seqNum, time));<a name="line.1553"></a>
<span class="sourceLineNo">1554</span>          replicationParents.add(ri);<a name="line.1554"></a>
<span class="sourceLineNo">1555</span>        }<a name="line.1555"></a>
<span class="sourceLineNo">1556</span>      }<a name="line.1556"></a>
<span class="sourceLineNo">1557</span>      // Put for parent<a name="line.1557"></a>
<span class="sourceLineNo">1558</span>      Put putOfMerged = makePutFromRegionInfo(mergedRegion, time);<a name="line.1558"></a>
<span class="sourceLineNo">1559</span>      putOfMerged = addMergeRegions(putOfMerged, parentSeqNum.keySet());<a name="line.1559"></a>
<span class="sourceLineNo">1560</span>      // Set initial state to CLOSED.<a name="line.1560"></a>
<span class="sourceLineNo">1561</span>      // NOTE: If initial state is not set to CLOSED then merged region gets added with the<a name="line.1561"></a>
<span class="sourceLineNo">1562</span>      // default OFFLINE state. If Master gets restarted after this step, start up sequence of<a name="line.1562"></a>
<span class="sourceLineNo">1563</span>      // master tries to assign this offline region. This is followed by re-assignments of the<a name="line.1563"></a>
<span class="sourceLineNo">1564</span>      // merged region from resumed {@link MergeTableRegionsProcedure}<a name="line.1564"></a>
<span class="sourceLineNo">1565</span>      addRegionStateToPut(putOfMerged, RegionState.State.CLOSED);<a name="line.1565"></a>
<span class="sourceLineNo">1566</span>      mutations.add(putOfMerged);<a name="line.1566"></a>
<span class="sourceLineNo">1567</span>      // The merged is a new region, openSeqNum = 1 is fine. ServerName may be null<a name="line.1567"></a>
<span class="sourceLineNo">1568</span>      // if crash after merge happened but before we got to here.. means in-memory<a name="line.1568"></a>
<span class="sourceLineNo">1569</span>      // locations of offlined merged, now-closed, regions is lost. Should be ok. We<a name="line.1569"></a>
<span class="sourceLineNo">1570</span>      // assign the merged region later.<a name="line.1570"></a>
<span class="sourceLineNo">1571</span>      if (sn != null) {<a name="line.1571"></a>
<span class="sourceLineNo">1572</span>        addLocation(putOfMerged, sn, 1, mergedRegion.getReplicaId());<a name="line.1572"></a>
<span class="sourceLineNo">1573</span>      }<a name="line.1573"></a>
<span class="sourceLineNo">1574</span><a name="line.1574"></a>
<span class="sourceLineNo">1575</span>      // Add empty locations for region replicas of the merged region so that number of replicas<a name="line.1575"></a>
<span class="sourceLineNo">1576</span>      // can be cached whenever the primary region is looked up from meta<a name="line.1576"></a>
<span class="sourceLineNo">1577</span>      for (int i = 1; i &lt; regionReplication; i++) {<a name="line.1577"></a>
<span class="sourceLineNo">1578</span>        addEmptyLocation(putOfMerged, i);<a name="line.1578"></a>
<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
<span class="sourceLineNo">1580</span>      // add parent reference for serial replication<a name="line.1580"></a>
<span class="sourceLineNo">1581</span>      if (!replicationParents.isEmpty()) {<a name="line.1581"></a>
<span class="sourceLineNo">1582</span>        addReplicationParent(putOfMerged, replicationParents);<a name="line.1582"></a>
<span class="sourceLineNo">1583</span>      }<a name="line.1583"></a>
<span class="sourceLineNo">1584</span>      byte[] tableRow = Bytes.toBytes(mergedRegion.getRegionNameAsString() + HConstants.DELIMITER);<a name="line.1584"></a>
<span class="sourceLineNo">1585</span>      multiMutate(meta, tableRow, mutations);<a name="line.1585"></a>
<span class="sourceLineNo">1586</span>    }<a name="line.1586"></a>
<span class="sourceLineNo">1587</span>  }<a name="line.1587"></a>
<span class="sourceLineNo">1588</span><a name="line.1588"></a>
<span class="sourceLineNo">1589</span>  /**<a name="line.1589"></a>
<span class="sourceLineNo">1590</span>   * Splits the region into two in an atomic operation. Offlines the parent region with the<a name="line.1590"></a>
<span class="sourceLineNo">1591</span>   * information that it is split into two, and also adds the daughter regions. Does not add the<a name="line.1591"></a>
<span class="sourceLineNo">1592</span>   * location information to the daughter regions since they are not open yet.<a name="line.1592"></a>
<span class="sourceLineNo">1593</span>   * @param connection connection we're using<a name="line.1593"></a>
<span class="sourceLineNo">1594</span>   * @param parent the parent region which is split<a name="line.1594"></a>
<span class="sourceLineNo">1595</span>   * @param parentOpenSeqNum the next open sequence id for parent region, used by serial<a name="line.1595"></a>
<span class="sourceLineNo">1596</span>   *          replication. -1 if not necessary.<a name="line.1596"></a>
<span class="sourceLineNo">1597</span>   * @param splitA Split daughter region A<a name="line.1597"></a>
<span class="sourceLineNo">1598</span>   * @param splitB Split daughter region B<a name="line.1598"></a>
<span class="sourceLineNo">1599</span>   * @param sn the location of the region<a name="line.1599"></a>
<span class="sourceLineNo">1600</span>   */<a name="line.1600"></a>
<span class="sourceLineNo">1601</span>  public static void splitRegion(Connection connection, RegionInfo parent, long parentOpenSeqNum,<a name="line.1601"></a>
<span class="sourceLineNo">1602</span>      RegionInfo splitA, RegionInfo splitB, ServerName sn, int regionReplication)<a name="line.1602"></a>
<span class="sourceLineNo">1603</span>      throws IOException {<a name="line.1603"></a>
<span class="sourceLineNo">1604</span>    try (Table meta = getMetaHTable(connection)) {<a name="line.1604"></a>
<span class="sourceLineNo">1605</span>      long time = EnvironmentEdgeManager.currentTime();<a name="line.1605"></a>
<span class="sourceLineNo">1606</span>      // Put for parent<a name="line.1606"></a>
<span class="sourceLineNo">1607</span>      Put putParent = makePutFromRegionInfo(RegionInfoBuilder.newBuilder(parent)<a name="line.1607"></a>
<span class="sourceLineNo">1608</span>                        .setOffline(true)<a name="line.1608"></a>
<span class="sourceLineNo">1609</span>                        .setSplit(true).build(), time);<a name="line.1609"></a>
<span class="sourceLineNo">1610</span>      addDaughtersToPut(putParent, splitA, splitB);<a name="line.1610"></a>
<span class="sourceLineNo">1611</span><a name="line.1611"></a>
<span class="sourceLineNo">1612</span>      // Puts for daughters<a name="line.1612"></a>
<span class="sourceLineNo">1613</span>      Put putA = makePutFromRegionInfo(splitA, time);<a name="line.1613"></a>
<span class="sourceLineNo">1614</span>      Put putB = makePutFromRegionInfo(splitB, time);<a name="line.1614"></a>
<span class="sourceLineNo">1615</span>      if (parentOpenSeqNum &gt; 0) {<a name="line.1615"></a>
<span class="sourceLineNo">1616</span>        addReplicationBarrier(putParent, parentOpenSeqNum);<a name="line.1616"></a>
<span class="sourceLineNo">1617</span>        addReplicationParent(putA, Collections.singletonList(parent));<a name="line.1617"></a>
<span class="sourceLineNo">1618</span>        addReplicationParent(putB, Collections.singletonList(parent));<a name="line.1618"></a>
<span class="sourceLineNo">1619</span>      }<a name="line.1619"></a>
<span class="sourceLineNo">1620</span>      // Set initial state to CLOSED<a name="line.1620"></a>
<span class="sourceLineNo">1621</span>      // NOTE: If initial state is not set to CLOSED then daughter regions get added with the<a name="line.1621"></a>
<span class="sourceLineNo">1622</span>      // default OFFLINE state. If Master gets restarted after this step, start up sequence of<a name="line.1622"></a>
<span class="sourceLineNo">1623</span>      // master tries to assign these offline regions. This is followed by re-assignments of the<a name="line.1623"></a>
<span class="sourceLineNo">1624</span>      // daughter regions from resumed {@link SplitTableRegionProcedure}<a name="line.1624"></a>
<span class="sourceLineNo">1625</span>      addRegionStateToPut(putA, RegionState.State.CLOSED);<a name="line.1625"></a>
<span class="sourceLineNo">1626</span>      addRegionStateToPut(putB, RegionState.State.CLOSED);<a name="line.1626"></a>
<span class="sourceLineNo">1627</span><a name="line.1627"></a>
<span class="sourceLineNo">1628</span>      addSequenceNum(putA, 1, splitA.getReplicaId()); // new regions, openSeqNum = 1 is fine.<a name="line.1628"></a>
<span class="sourceLineNo">1629</span>      addSequenceNum(putB, 1, splitB.getReplicaId());<a name="line.1629"></a>
<span class="sourceLineNo">1630</span><a name="line.1630"></a>
<span class="sourceLineNo">1631</span>      // Add empty locations for region replicas of daughters so that number of replicas can be<a name="line.1631"></a>
<span class="sourceLineNo">1632</span>      // cached whenever the primary region is looked up from meta<a name="line.1632"></a>
<span class="sourceLineNo">1633</span>      for (int i = 1; i &lt; regionReplication; i++) {<a name="line.1633"></a>
<span class="sourceLineNo">1634</span>        addEmptyLocation(putA, i);<a name="line.1634"></a>
<span class="sourceLineNo">1635</span>        addEmptyLocation(putB, i);<a name="line.1635"></a>
<span class="sourceLineNo">1636</span>      }<a name="line.1636"></a>
<span class="sourceLineNo">1637</span><a name="line.1637"></a>
<span class="sourceLineNo">1638</span>      byte[] tableRow = Bytes.toBytes(parent.getRegionNameAsString() + HConstants.DELIMITER);<a name="line.1638"></a>
<span class="sourceLineNo">1639</span>      multiMutate(meta, tableRow, putParent, putA, putB);<a name="line.1639"></a>
<span class="sourceLineNo">1640</span>    }<a name="line.1640"></a>
<span class="sourceLineNo">1641</span>  }<a name="line.1641"></a>
<span class="sourceLineNo">1642</span><a name="line.1642"></a>
<span class="sourceLineNo">1643</span>  /**<a name="line.1643"></a>
<span class="sourceLineNo">1644</span>   * Update state of the table in meta.<a name="line.1644"></a>
<span class="sourceLineNo">1645</span>   * @param connection what we use for update<a name="line.1645"></a>
<span class="sourceLineNo">1646</span>   * @param state new state<a name="line.1646"></a>
<span class="sourceLineNo">1647</span>   */<a name="line.1647"></a>
<span class="sourceLineNo">1648</span>  private static void updateTableState(Connection connection, TableState state) throws IOException {<a name="line.1648"></a>
<span class="sourceLineNo">1649</span>    Put put = makePutFromTableState(state, EnvironmentEdgeManager.currentTime());<a name="line.1649"></a>
<span class="sourceLineNo">1650</span>    putToMetaTable(connection, put);<a name="line.1650"></a>
<span class="sourceLineNo">1651</span>    LOG.info("Updated {} in hbase:meta", state);<a name="line.1651"></a>
<span class="sourceLineNo">1652</span>  }<a name="line.1652"></a>
<span class="sourceLineNo">1653</span><a name="line.1653"></a>
<span class="sourceLineNo">1654</span>  /**<a name="line.1654"></a>
<span class="sourceLineNo">1655</span>   * Construct PUT for given state<a name="line.1655"></a>
<span class="sourceLineNo">1656</span>   * @param state new state<a name="line.1656"></a>
<span class="sourceLineNo">1657</span>   */<a name="line.1657"></a>
<span class="sourceLineNo">1658</span>  public static Put makePutFromTableState(TableState state, long ts) {<a name="line.1658"></a>
<span class="sourceLineNo">1659</span>    Put put = new Put(state.getTableName().getName(), ts);<a name="line.1659"></a>
<span class="sourceLineNo">1660</span>    put.addColumn(getTableFamily(), getTableStateColumn(), state.convert().toByteArray());<a name="line.1660"></a>
<span class="sourceLineNo">1661</span>    return put;<a name="line.1661"></a>
<span class="sourceLineNo">1662</span>  }<a name="line.1662"></a>
<span class="sourceLineNo">1663</span><a name="line.1663"></a>
<span class="sourceLineNo">1664</span>  /**<a name="line.1664"></a>
<span class="sourceLineNo">1665</span>   * Remove state for table from meta<a name="line.1665"></a>
<span class="sourceLineNo">1666</span>   * @param connection to use for deletion<a name="line.1666"></a>
<span class="sourceLineNo">1667</span>   * @param table to delete state for<a name="line.1667"></a>
<span class="sourceLineNo">1668</span>   */<a name="line.1668"></a>
<span class="sourceLineNo">1669</span>  public static void deleteTableState(Connection connection, TableName table)<a name="line.1669"></a>
<span class="sourceLineNo">1670</span>      throws IOException {<a name="line.1670"></a>
<span class="sourceLineNo">1671</span>    long time = EnvironmentEdgeManager.currentTime();<a name="line.1671"></a>
<span class="sourceLineNo">1672</span>    Delete delete = new Delete(table.getName());<a name="line.1672"></a>
<span class="sourceLineNo">1673</span>    delete.addColumns(getTableFamily(), getTableStateColumn(), time);<a name="line.1673"></a>
<span class="sourceLineNo">1674</span>    deleteFromMetaTable(connection, delete);<a name="line.1674"></a>
<span class="sourceLineNo">1675</span>    LOG.info("Deleted table " + table + " state from META");<a name="line.1675"></a>
<span class="sourceLineNo">1676</span>  }<a name="line.1676"></a>
<span class="sourceLineNo">1677</span><a name="line.1677"></a>
<span class="sourceLineNo">1678</span>  private static void multiMutate(Table table, byte[] row,<a name="line.1678"></a>
<span class="sourceLineNo">1679</span>      Mutation... mutations) throws IOException {<a name="line.1679"></a>
<span class="sourceLineNo">1680</span>    multiMutate(table, row, Arrays.asList(mutations));<a name="line.1680"></a>
<span class="sourceLineNo">1681</span>  }<a name="line.1681"></a>
<span class="sourceLineNo">1682</span><a name="line.1682"></a>
<span class="sourceLineNo">1683</span>  /**<a name="line.1683"></a>
<span class="sourceLineNo">1684</span>   * Performs an atomic multi-mutate operation against the given table.<a name="line.1684"></a>
<span class="sourceLineNo">1685</span>   */<a name="line.1685"></a>
<span class="sourceLineNo">1686</span>  private static void multiMutate(final Table table, byte[] row, final List&lt;Mutation&gt; mutations)<a name="line.1686"></a>
<span class="sourceLineNo">1687</span>      throws IOException {<a name="line.1687"></a>
<span class="sourceLineNo">1688</span>    debugLogMutations(mutations);<a name="line.1688"></a>
<span class="sourceLineNo">1689</span>    Batch.Call&lt;MultiRowMutationService, MutateRowsResponse&gt; callable =<a name="line.1689"></a>
<span class="sourceLineNo">1690</span>      new Batch.Call&lt;MultiRowMutationService, MutateRowsResponse&gt;() {<a name="line.1690"></a>
<span class="sourceLineNo">1691</span><a name="line.1691"></a>
<span class="sourceLineNo">1692</span>        @Override<a name="line.1692"></a>
<span class="sourceLineNo">1693</span>        public MutateRowsResponse call(MultiRowMutationService instance) throws IOException {<a name="line.1693"></a>
<span class="sourceLineNo">1694</span>          MutateRowsRequest.Builder builder = MutateRowsRequest.newBuilder();<a name="line.1694"></a>
<span class="sourceLineNo">1695</span>          for (Mutation mutation : mutations) {<a name="line.1695"></a>
<span class="sourceLineNo">1696</span>            if (mutation instanceof Put) {<a name="line.1696"></a>
<span class="sourceLineNo">1697</span>              builder.addMutationRequest(<a name="line.1697"></a>
<span class="sourceLineNo">1698</span>                ProtobufUtil.toMutation(ClientProtos.MutationProto.MutationType.PUT, mutation));<a name="line.1698"></a>
<span class="sourceLineNo">1699</span>            } else if (mutation instanceof Delete) {<a name="line.1699"></a>
<span class="sourceLineNo">1700</span>              builder.addMutationRequest(<a name="line.1700"></a>
<span class="sourceLineNo">1701</span>                ProtobufUtil.toMutation(ClientProtos.MutationProto.MutationType.DELETE, mutation));<a name="line.1701"></a>
<span class="sourceLineNo">1702</span>            } else {<a name="line.1702"></a>
<span class="sourceLineNo">1703</span>              throw new DoNotRetryIOException(<a name="line.1703"></a>
<span class="sourceLineNo">1704</span>                "multi in MetaEditor doesn't support " + mutation.getClass().getName());<a name="line.1704"></a>
<span class="sourceLineNo">1705</span>            }<a name="line.1705"></a>
<span class="sourceLineNo">1706</span>          }<a name="line.1706"></a>
<span class="sourceLineNo">1707</span>          ServerRpcController controller = new ServerRpcController();<a name="line.1707"></a>
<span class="sourceLineNo">1708</span>          CoprocessorRpcUtils.BlockingRpcCallback&lt;MutateRowsResponse&gt; rpcCallback =<a name="line.1708"></a>
<span class="sourceLineNo">1709</span>            new CoprocessorRpcUtils.BlockingRpcCallback&lt;&gt;();<a name="line.1709"></a>
<span class="sourceLineNo">1710</span>          instance.mutateRows(controller, builder.build(), rpcCallback);<a name="line.1710"></a>
<span class="sourceLineNo">1711</span>          MutateRowsResponse resp = rpcCallback.get();<a name="line.1711"></a>
<span class="sourceLineNo">1712</span>          if (controller.failedOnException()) {<a name="line.1712"></a>
<span class="sourceLineNo">1713</span>            throw controller.getFailedOn();<a name="line.1713"></a>
<span class="sourceLineNo">1714</span>          }<a name="line.1714"></a>
<span class="sourceLineNo">1715</span>          return resp;<a name="line.1715"></a>
<span class="sourceLineNo">1716</span>        }<a name="line.1716"></a>
<span class="sourceLineNo">1717</span>      };<a name="line.1717"></a>
<span class="sourceLineNo">1718</span>    try {<a name="line.1718"></a>
<span class="sourceLineNo">1719</span>      table.coprocessorService(MultiRowMutationService.class, row, row, callable);<a name="line.1719"></a>
<span class="sourceLineNo">1720</span>    } catch (Throwable e) {<a name="line.1720"></a>
<span class="sourceLineNo">1721</span>      Throwables.propagateIfPossible(e, IOException.class);<a name="line.1721"></a>
<span class="sourceLineNo">1722</span>      throw new IOException(e);<a name="line.1722"></a>
<span class="sourceLineNo">1723</span>    }<a name="line.1723"></a>
<span class="sourceLineNo">1724</span>  }<a name="line.1724"></a>
<span class="sourceLineNo">1725</span><a name="line.1725"></a>
<span class="sourceLineNo">1726</span>  /**<a name="line.1726"></a>
<span class="sourceLineNo">1727</span>   * Updates the location of the specified region in hbase:meta to be the specified server hostname<a name="line.1727"></a>
<span class="sourceLineNo">1728</span>   * and startcode.<a name="line.1728"></a>
<span class="sourceLineNo">1729</span>   * &lt;p&gt;<a name="line.1729"></a>
<span class="sourceLineNo">1730</span>   * Uses passed catalog tracker to get a connection to the server hosting hbase:meta and makes<a name="line.1730"></a>
<span class="sourceLineNo">1731</span>   * edits to that region.<a name="line.1731"></a>
<span class="sourceLineNo">1732</span>   * @param connection connection we're using<a name="line.1732"></a>
<span class="sourceLineNo">1733</span>   * @param regionInfo region to update location of<a name="line.1733"></a>
<span class="sourceLineNo">1734</span>   * @param openSeqNum the latest sequence number obtained when the region was open<a name="line.1734"></a>
<span class="sourceLineNo">1735</span>   * @param sn Server name<a name="line.1735"></a>
<span class="sourceLineNo">1736</span>   * @param masterSystemTime wall clock time from master if passed in the open region RPC<a name="line.1736"></a>
<span class="sourceLineNo">1737</span>   */<a name="line.1737"></a>
<span class="sourceLineNo">1738</span>  @VisibleForTesting<a name="line.1738"></a>
<span class="sourceLineNo">1739</span>  public static void updateRegionLocation(Connection connection, RegionInfo regionInfo,<a name="line.1739"></a>
<span class="sourceLineNo">1740</span>      ServerName sn, long openSeqNum, long masterSystemTime) throws IOException {<a name="line.1740"></a>
<span class="sourceLineNo">1741</span>    updateLocation(connection, regionInfo, sn, openSeqNum, masterSystemTime);<a name="line.1741"></a>
<span class="sourceLineNo">1742</span>  }<a name="line.1742"></a>
<span class="sourceLineNo">1743</span><a name="line.1743"></a>
<span class="sourceLineNo">1744</span>  /**<a name="line.1744"></a>
<span class="sourceLineNo">1745</span>   * Updates the location of the specified region to be the specified server.<a name="line.1745"></a>
<span class="sourceLineNo">1746</span>   * &lt;p&gt;<a name="line.1746"></a>
<span class="sourceLineNo">1747</span>   * Connects to the specified server which should be hosting the specified catalog region name to<a name="line.1747"></a>
<span class="sourceLineNo">1748</span>   * perform the edit.<a name="line.1748"></a>
<span class="sourceLineNo">1749</span>   * @param connection connection we're using<a name="line.1749"></a>
<span class="sourceLineNo">1750</span>   * @param regionInfo region to update location of<a name="line.1750"></a>
<span class="sourceLineNo">1751</span>   * @param sn Server name<a name="line.1751"></a>
<span class="sourceLineNo">1752</span>   * @param openSeqNum the latest sequence number obtained when the region was open<a name="line.1752"></a>
<span class="sourceLineNo">1753</span>   * @param masterSystemTime wall clock time from master if passed in the open region RPC<a name="line.1753"></a>
<span class="sourceLineNo">1754</span>   * @throws IOException In particular could throw {@link java.net.ConnectException} if the server<a name="line.1754"></a>
<span class="sourceLineNo">1755</span>   *           is down on other end.<a name="line.1755"></a>
<span class="sourceLineNo">1756</span>   */<a name="line.1756"></a>
<span class="sourceLineNo">1757</span>  private static void updateLocation(Connection connection, RegionInfo regionInfo, ServerName sn,<a name="line.1757"></a>
<span class="sourceLineNo">1758</span>      long openSeqNum, long masterSystemTime) throws IOException {<a name="line.1758"></a>
<span class="sourceLineNo">1759</span>    // region replicas are kept in the primary region's row<a name="line.1759"></a>
<span class="sourceLineNo">1760</span>    Put put = new Put(getMetaKeyForRegion(regionInfo), masterSystemTime);<a name="line.1760"></a>
<span class="sourceLineNo">1761</span>    addRegionInfo(put, regionInfo);<a name="line.1761"></a>
<span class="sourceLineNo">1762</span>    addLocation(put, sn, openSeqNum, regionInfo.getReplicaId());<a name="line.1762"></a>
<span class="sourceLineNo">1763</span>    putToMetaTable(connection, put);<a name="line.1763"></a>
<span class="sourceLineNo">1764</span>    LOG.info("Updated row {} with server=", regionInfo.getRegionNameAsString(), sn);<a name="line.1764"></a>
<span class="sourceLineNo">1765</span>  }<a name="line.1765"></a>
<span class="sourceLineNo">1766</span><a name="line.1766"></a>
<span class="sourceLineNo">1767</span>  /**<a name="line.1767"></a>
<span class="sourceLineNo">1768</span>   * Deletes the specified region from META.<a name="line.1768"></a>
<span class="sourceLineNo">1769</span>   * @param connection connection we're using<a name="line.1769"></a>
<span class="sourceLineNo">1770</span>   * @param regionInfo region to be deleted from META<a name="line.1770"></a>
<span class="sourceLineNo">1771</span>   */<a name="line.1771"></a>
<span class="sourceLineNo">1772</span>  public static void deleteRegionInfo(Connection connection, RegionInfo regionInfo)<a name="line.1772"></a>
<span class="sourceLineNo">1773</span>      throws IOException {<a name="line.1773"></a>
<span class="sourceLineNo">1774</span>    Delete delete = new Delete(regionInfo.getRegionName());<a name="line.1774"></a>
<span class="sourceLineNo">1775</span>    delete.addFamily(getCatalogFamily(), HConstants.LATEST_TIMESTAMP);<a name="line.1775"></a>
<span class="sourceLineNo">1776</span>    deleteFromMetaTable(connection, delete);<a name="line.1776"></a>
<span class="sourceLineNo">1777</span>    LOG.info("Deleted " + regionInfo.getRegionNameAsString());<a name="line.1777"></a>
<span class="sourceLineNo">1778</span>  }<a name="line.1778"></a>
<span class="sourceLineNo">1779</span><a name="line.1779"></a>
<span class="sourceLineNo">1780</span>  /**<a name="line.1780"></a>
<span class="sourceLineNo">1781</span>   * Deletes the specified regions from META.<a name="line.1781"></a>
<span class="sourceLineNo">1782</span>   * @param connection connection we're using<a name="line.1782"></a>
<span class="sourceLineNo">1783</span>   * @param regionsInfo list of regions to be deleted from META<a name="line.1783"></a>
<span class="sourceLineNo">1784</span>   */<a name="line.1784"></a>
<span class="sourceLineNo">1785</span>  public static void deleteRegionInfos(Connection connection, List&lt;RegionInfo&gt; regionsInfo)<a name="line.1785"></a>
<span class="sourceLineNo">1786</span>      throws IOException {<a name="line.1786"></a>
<span class="sourceLineNo">1787</span>    deleteRegionInfos(connection, regionsInfo, EnvironmentEdgeManager.currentTime());<a name="line.1787"></a>
<span class="sourceLineNo">1788</span>  }<a name="line.1788"></a>
<span class="sourceLineNo">1789</span><a name="line.1789"></a>
<span class="sourceLineNo">1790</span>  /**<a name="line.1790"></a>
<span class="sourceLineNo">1791</span>   * Deletes the specified regions from META.<a name="line.1791"></a>
<span class="sourceLineNo">1792</span>   * @param connection connection we're using<a name="line.1792"></a>
<span class="sourceLineNo">1793</span>   * @param regionsInfo list of regions to be deleted from META<a name="line.1793"></a>
<span class="sourceLineNo">1794</span>   */<a name="line.1794"></a>
<span class="sourceLineNo">1795</span>  private static void deleteRegionInfos(Connection connection, List&lt;RegionInfo&gt; regionsInfo,<a name="line.1795"></a>
<span class="sourceLineNo">1796</span>        long ts)<a name="line.1796"></a>
<span class="sourceLineNo">1797</span>      throws IOException {<a name="line.1797"></a>
<span class="sourceLineNo">1798</span>    List&lt;Delete&gt; deletes = new ArrayList&lt;&gt;(regionsInfo.size());<a name="line.1798"></a>
<span class="sourceLineNo">1799</span>    for (RegionInfo hri : regionsInfo) {<a name="line.1799"></a>
<span class="sourceLineNo">1800</span>      Delete e = new Delete(hri.getRegionName());<a name="line.1800"></a>
<span class="sourceLineNo">1801</span>      e.addFamily(getCatalogFamily(), ts);<a name="line.1801"></a>
<span class="sourceLineNo">1802</span>      deletes.add(e);<a name="line.1802"></a>
<span class="sourceLineNo">1803</span>    }<a name="line.1803"></a>
<span class="sourceLineNo">1804</span>    deleteFromMetaTable(connection, deletes);<a name="line.1804"></a>
<span class="sourceLineNo">1805</span>    LOG.info("Deleted {} regions from META", regionsInfo.size());<a name="line.1805"></a>
<span class="sourceLineNo">1806</span>    LOG.debug("Deleted regions: {}", regionsInfo);<a name="line.1806"></a>
<span class="sourceLineNo">1807</span>  }<a name="line.1807"></a>
<span class="sourceLineNo">1808</span><a name="line.1808"></a>
<span class="sourceLineNo">1809</span>  /**<a name="line.1809"></a>
<span class="sourceLineNo">1810</span>   * Overwrites the specified regions from hbase:meta. Deletes old rows for the given regions and<a name="line.1810"></a>
<span class="sourceLineNo">1811</span>   * adds new ones. Regions added back have state CLOSED.<a name="line.1811"></a>
<span class="sourceLineNo">1812</span>   * @param connection connection we're using<a name="line.1812"></a>
<span class="sourceLineNo">1813</span>   * @param regionInfos list of regions to be added to META<a name="line.1813"></a>
<span class="sourceLineNo">1814</span>   */<a name="line.1814"></a>
<span class="sourceLineNo">1815</span>  public static void overwriteRegions(Connection connection, List&lt;RegionInfo&gt; regionInfos,<a name="line.1815"></a>
<span class="sourceLineNo">1816</span>      int regionReplication) throws IOException {<a name="line.1816"></a>
<span class="sourceLineNo">1817</span>    // use master time for delete marker and the Put<a name="line.1817"></a>
<span class="sourceLineNo">1818</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.1818"></a>
<span class="sourceLineNo">1819</span>    deleteRegionInfos(connection, regionInfos, now);<a name="line.1819"></a>
<span class="sourceLineNo">1820</span>    // Why sleep? This is the easiest way to ensure that the previous deletes does not<a name="line.1820"></a>
<span class="sourceLineNo">1821</span>    // eclipse the following puts, that might happen in the same ts from the server.<a name="line.1821"></a>
<span class="sourceLineNo">1822</span>    // See HBASE-9906, and HBASE-9879. Once either HBASE-9879, HBASE-8770 is fixed,<a name="line.1822"></a>
<span class="sourceLineNo">1823</span>    // or HBASE-9905 is fixed and meta uses seqIds, we do not need the sleep.<a name="line.1823"></a>
<span class="sourceLineNo">1824</span>    //<a name="line.1824"></a>
<span class="sourceLineNo">1825</span>    // HBASE-13875 uses master timestamp for the mutations. The 20ms sleep is not needed<a name="line.1825"></a>
<span class="sourceLineNo">1826</span>    addRegionsToMeta(connection, regionInfos, regionReplication, now + 1);<a name="line.1826"></a>
<span class="sourceLineNo">1827</span>    LOG.info("Overwritten " + regionInfos.size() + " regions to Meta");<a name="line.1827"></a>
<span class="sourceLineNo">1828</span>    LOG.debug("Overwritten regions: {} ", regionInfos);<a name="line.1828"></a>
<span class="sourceLineNo">1829</span>  }<a name="line.1829"></a>
<span class="sourceLineNo">1830</span><a name="line.1830"></a>
<span class="sourceLineNo">1831</span>  /**<a name="line.1831"></a>
<span class="sourceLineNo">1832</span>   * Deletes merge qualifiers for the specified merge region.<a name="line.1832"></a>
<span class="sourceLineNo">1833</span>   * @param connection connection we're using<a name="line.1833"></a>
<span class="sourceLineNo">1834</span>   * @param mergeRegion the merged region<a name="line.1834"></a>
<span class="sourceLineNo">1835</span>   */<a name="line.1835"></a>
<span class="sourceLineNo">1836</span>  public static void deleteMergeQualifiers(Connection connection, final RegionInfo mergeRegion)<a name="line.1836"></a>
<span class="sourceLineNo">1837</span>      throws IOException {<a name="line.1837"></a>
<span class="sourceLineNo">1838</span>    Delete delete = new Delete(mergeRegion.getRegionName());<a name="line.1838"></a>
<span class="sourceLineNo">1839</span>    // NOTE: We are doing a new hbase:meta read here.<a name="line.1839"></a>
<span class="sourceLineNo">1840</span>    Cell [] cells = getMergeRegionsRaw(connection, mergeRegion.getRegionName());<a name="line.1840"></a>
<span class="sourceLineNo">1841</span>    if (cells == null || cells.length == 0) {<a name="line.1841"></a>
<span class="sourceLineNo">1842</span>      return;<a name="line.1842"></a>
<span class="sourceLineNo">1843</span>    }<a name="line.1843"></a>
<span class="sourceLineNo">1844</span>    List&lt;byte[]&gt; qualifiers = new ArrayList&lt;&gt;(cells.length);<a name="line.1844"></a>
<span class="sourceLineNo">1845</span>    for (Cell cell : cells) {<a name="line.1845"></a>
<span class="sourceLineNo">1846</span>      byte[] qualifier = CellUtil.cloneQualifier(cell);<a name="line.1846"></a>
<span class="sourceLineNo">1847</span>      qualifiers.add(qualifier);<a name="line.1847"></a>
<span class="sourceLineNo">1848</span>      delete.addColumns(getCatalogFamily(), qualifier, HConstants.LATEST_TIMESTAMP);<a name="line.1848"></a>
<span class="sourceLineNo">1849</span>    }<a name="line.1849"></a>
<span class="sourceLineNo">1850</span>    deleteFromMetaTable(connection, delete);<a name="line.1850"></a>
<span class="sourceLineNo">1851</span>    LOG.info("Deleted merge references in " + mergeRegion.getRegionNameAsString() +<a name="line.1851"></a>
<span class="sourceLineNo">1852</span>        ", deleted qualifiers " +<a name="line.1852"></a>
<span class="sourceLineNo">1853</span>        qualifiers.stream().map(Bytes::toStringBinary).<a name="line.1853"></a>
<span class="sourceLineNo">1854</span>            collect(Collectors.joining(", ")));<a name="line.1854"></a>
<span class="sourceLineNo">1855</span>  }<a name="line.1855"></a>
<span class="sourceLineNo">1856</span><a name="line.1856"></a>
<span class="sourceLineNo">1857</span>  public static Put addRegionInfo(final Put p, final RegionInfo hri)<a name="line.1857"></a>
<span class="sourceLineNo">1858</span>    throws IOException {<a name="line.1858"></a>
<span class="sourceLineNo">1859</span>    p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.1859"></a>
<span class="sourceLineNo">1860</span>        .setRow(p.getRow())<a name="line.1860"></a>
<span class="sourceLineNo">1861</span>        .setFamily(getCatalogFamily())<a name="line.1861"></a>
<span class="sourceLineNo">1862</span>        .setQualifier(HConstants.REGIONINFO_QUALIFIER)<a name="line.1862"></a>
<span class="sourceLineNo">1863</span>        .setTimestamp(p.getTimestamp())<a name="line.1863"></a>
<span class="sourceLineNo">1864</span>        .setType(Type.Put)<a name="line.1864"></a>
<span class="sourceLineNo">1865</span>        .setValue(RegionInfo.toByteArray(hri))<a name="line.1865"></a>
<span class="sourceLineNo">1866</span>        .build());<a name="line.1866"></a>
<span class="sourceLineNo">1867</span>    return p;<a name="line.1867"></a>
<span class="sourceLineNo">1868</span>  }<a name="line.1868"></a>
<span class="sourceLineNo">1869</span><a name="line.1869"></a>
<span class="sourceLineNo">1870</span>  public static Put addLocation(Put p, ServerName sn, long openSeqNum, int replicaId)<a name="line.1870"></a>
<span class="sourceLineNo">1871</span>      throws IOException {<a name="line.1871"></a>
<span class="sourceLineNo">1872</span>    CellBuilder builder = CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);<a name="line.1872"></a>
<span class="sourceLineNo">1873</span>    return p.add(builder.clear()<a name="line.1873"></a>
<span class="sourceLineNo">1874</span>              .setRow(p.getRow())<a name="line.1874"></a>
<span class="sourceLineNo">1875</span>              .setFamily(getCatalogFamily())<a name="line.1875"></a>
<span class="sourceLineNo">1876</span>              .setQualifier(getServerColumn(replicaId))<a name="line.1876"></a>
<span class="sourceLineNo">1877</span>              .setTimestamp(p.getTimestamp())<a name="line.1877"></a>
<span class="sourceLineNo">1878</span>              .setType(Cell.Type.Put)<a name="line.1878"></a>
<span class="sourceLineNo">1879</span>              .setValue(Bytes.toBytes(sn.getAddress().toString()))<a name="line.1879"></a>
<span class="sourceLineNo">1880</span>              .build())<a name="line.1880"></a>
<span class="sourceLineNo">1881</span>            .add(builder.clear()<a name="line.1881"></a>
<span class="sourceLineNo">1882</span>              .setRow(p.getRow())<a name="line.1882"></a>
<span class="sourceLineNo">1883</span>              .setFamily(getCatalogFamily())<a name="line.1883"></a>
<span class="sourceLineNo">1884</span>              .setQualifier(getStartCodeColumn(replicaId))<a name="line.1884"></a>
<span class="sourceLineNo">1885</span>              .setTimestamp(p.getTimestamp())<a name="line.1885"></a>
<span class="sourceLineNo">1886</span>              .setType(Cell.Type.Put)<a name="line.1886"></a>
<span class="sourceLineNo">1887</span>              .setValue(Bytes.toBytes(sn.getStartcode()))<a name="line.1887"></a>
<span class="sourceLineNo">1888</span>              .build())<a name="line.1888"></a>
<span class="sourceLineNo">1889</span>            .add(builder.clear()<a name="line.1889"></a>
<span class="sourceLineNo">1890</span>              .setRow(p.getRow())<a name="line.1890"></a>
<span class="sourceLineNo">1891</span>              .setFamily(getCatalogFamily())<a name="line.1891"></a>
<span class="sourceLineNo">1892</span>              .setQualifier(getSeqNumColumn(replicaId))<a name="line.1892"></a>
<span class="sourceLineNo">1893</span>              .setTimestamp(p.getTimestamp())<a name="line.1893"></a>
<span class="sourceLineNo">1894</span>              .setType(Type.Put)<a name="line.1894"></a>
<span class="sourceLineNo">1895</span>              .setValue(Bytes.toBytes(openSeqNum))<a name="line.1895"></a>
<span class="sourceLineNo">1896</span>              .build());<a name="line.1896"></a>
<span class="sourceLineNo">1897</span>  }<a name="line.1897"></a>
<span class="sourceLineNo">1898</span><a name="line.1898"></a>
<span class="sourceLineNo">1899</span>  private static void writeRegionName(ByteArrayOutputStream out, byte[] regionName) {<a name="line.1899"></a>
<span class="sourceLineNo">1900</span>    for (byte b : regionName) {<a name="line.1900"></a>
<span class="sourceLineNo">1901</span>      if (b == ESCAPE_BYTE) {<a name="line.1901"></a>
<span class="sourceLineNo">1902</span>        out.write(ESCAPE_BYTE);<a name="line.1902"></a>
<span class="sourceLineNo">1903</span>      }<a name="line.1903"></a>
<span class="sourceLineNo">1904</span>      out.write(b);<a name="line.1904"></a>
<span class="sourceLineNo">1905</span>    }<a name="line.1905"></a>
<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
<span class="sourceLineNo">1907</span><a name="line.1907"></a>
<span class="sourceLineNo">1908</span>  @VisibleForTesting<a name="line.1908"></a>
<span class="sourceLineNo">1909</span>  public static byte[] getParentsBytes(List&lt;RegionInfo&gt; parents) {<a name="line.1909"></a>
<span class="sourceLineNo">1910</span>    ByteArrayOutputStream bos = new ByteArrayOutputStream();<a name="line.1910"></a>
<span class="sourceLineNo">1911</span>    Iterator&lt;RegionInfo&gt; iter = parents.iterator();<a name="line.1911"></a>
<span class="sourceLineNo">1912</span>    writeRegionName(bos, iter.next().getRegionName());<a name="line.1912"></a>
<span class="sourceLineNo">1913</span>    while (iter.hasNext()) {<a name="line.1913"></a>
<span class="sourceLineNo">1914</span>      bos.write(ESCAPE_BYTE);<a name="line.1914"></a>
<span class="sourceLineNo">1915</span>      bos.write(SEPARATED_BYTE);<a name="line.1915"></a>
<span class="sourceLineNo">1916</span>      writeRegionName(bos, iter.next().getRegionName());<a name="line.1916"></a>
<span class="sourceLineNo">1917</span>    }<a name="line.1917"></a>
<span class="sourceLineNo">1918</span>    return bos.toByteArray();<a name="line.1918"></a>
<span class="sourceLineNo">1919</span>  }<a name="line.1919"></a>
<span class="sourceLineNo">1920</span><a name="line.1920"></a>
<span class="sourceLineNo">1921</span>  private static List&lt;byte[]&gt; parseParentsBytes(byte[] bytes) {<a name="line.1921"></a>
<span class="sourceLineNo">1922</span>    List&lt;byte[]&gt; parents = new ArrayList&lt;&gt;();<a name="line.1922"></a>
<span class="sourceLineNo">1923</span>    ByteArrayOutputStream bos = new ByteArrayOutputStream();<a name="line.1923"></a>
<span class="sourceLineNo">1924</span>    for (int i = 0; i &lt; bytes.length; i++) {<a name="line.1924"></a>
<span class="sourceLineNo">1925</span>      if (bytes[i] == ESCAPE_BYTE) {<a name="line.1925"></a>
<span class="sourceLineNo">1926</span>        i++;<a name="line.1926"></a>
<span class="sourceLineNo">1927</span>        if (bytes[i] == SEPARATED_BYTE) {<a name="line.1927"></a>
<span class="sourceLineNo">1928</span>          parents.add(bos.toByteArray());<a name="line.1928"></a>
<span class="sourceLineNo">1929</span>          bos.reset();<a name="line.1929"></a>
<span class="sourceLineNo">1930</span>          continue;<a name="line.1930"></a>
<span class="sourceLineNo">1931</span>        }<a name="line.1931"></a>
<span class="sourceLineNo">1932</span>        // fall through to append the byte<a name="line.1932"></a>
<span class="sourceLineNo">1933</span>      }<a name="line.1933"></a>
<span class="sourceLineNo">1934</span>      bos.write(bytes[i]);<a name="line.1934"></a>
<span class="sourceLineNo">1935</span>    }<a name="line.1935"></a>
<span class="sourceLineNo">1936</span>    if (bos.size() &gt; 0) {<a name="line.1936"></a>
<span class="sourceLineNo">1937</span>      parents.add(bos.toByteArray());<a name="line.1937"></a>
<span class="sourceLineNo">1938</span>    }<a name="line.1938"></a>
<span class="sourceLineNo">1939</span>    return parents;<a name="line.1939"></a>
<span class="sourceLineNo">1940</span>  }<a name="line.1940"></a>
<span class="sourceLineNo">1941</span><a name="line.1941"></a>
<span class="sourceLineNo">1942</span>  private static void addReplicationParent(Put put, List&lt;RegionInfo&gt; parents) throws IOException {<a name="line.1942"></a>
<span class="sourceLineNo">1943</span>    byte[] value = getParentsBytes(parents);<a name="line.1943"></a>
<span class="sourceLineNo">1944</span>    put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY).setRow(put.getRow())<a name="line.1944"></a>
<span class="sourceLineNo">1945</span>      .setFamily(HConstants.REPLICATION_BARRIER_FAMILY).setQualifier(REPLICATION_PARENT_QUALIFIER)<a name="line.1945"></a>
<span class="sourceLineNo">1946</span>      .setTimestamp(put.getTimestamp()).setType(Type.Put).setValue(value).build());<a name="line.1946"></a>
<span class="sourceLineNo">1947</span>  }<a name="line.1947"></a>
<span class="sourceLineNo">1948</span><a name="line.1948"></a>
<span class="sourceLineNo">1949</span>  public static Put makePutForReplicationBarrier(RegionInfo regionInfo, long openSeqNum, long ts)<a name="line.1949"></a>
<span class="sourceLineNo">1950</span>      throws IOException {<a name="line.1950"></a>
<span class="sourceLineNo">1951</span>    Put put = new Put(regionInfo.getRegionName(), ts);<a name="line.1951"></a>
<span class="sourceLineNo">1952</span>    addReplicationBarrier(put, openSeqNum);<a name="line.1952"></a>
<span class="sourceLineNo">1953</span>    return put;<a name="line.1953"></a>
<span class="sourceLineNo">1954</span>  }<a name="line.1954"></a>
<span class="sourceLineNo">1955</span><a name="line.1955"></a>
<span class="sourceLineNo">1956</span>  public static void addReplicationBarrier(Put put, long openSeqNum) throws IOException {<a name="line.1956"></a>
<span class="sourceLineNo">1957</span>    put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.1957"></a>
<span class="sourceLineNo">1958</span>      .setRow(put.getRow())<a name="line.1958"></a>
<span class="sourceLineNo">1959</span>      .setFamily(HConstants.REPLICATION_BARRIER_FAMILY)<a name="line.1959"></a>
<span class="sourceLineNo">1960</span>      .setQualifier(HConstants.SEQNUM_QUALIFIER)<a name="line.1960"></a>
<span class="sourceLineNo">1961</span>      .setTimestamp(put.getTimestamp())<a name="line.1961"></a>
<span class="sourceLineNo">1962</span>      .setType(Type.Put)<a name="line.1962"></a>
<span class="sourceLineNo">1963</span>      .setValue(Bytes.toBytes(openSeqNum))<a name="line.1963"></a>
<span class="sourceLineNo">1964</span>      .build());<a name="line.1964"></a>
<span class="sourceLineNo">1965</span>  }<a name="line.1965"></a>
<span class="sourceLineNo">1966</span><a name="line.1966"></a>
<span class="sourceLineNo">1967</span>  private static Put addEmptyLocation(Put p, int replicaId) throws IOException {<a name="line.1967"></a>
<span class="sourceLineNo">1968</span>    CellBuilder builder = CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);<a name="line.1968"></a>
<span class="sourceLineNo">1969</span>    return p.add(builder.clear()<a name="line.1969"></a>
<span class="sourceLineNo">1970</span>                .setRow(p.getRow())<a name="line.1970"></a>
<span class="sourceLineNo">1971</span>                .setFamily(getCatalogFamily())<a name="line.1971"></a>
<span class="sourceLineNo">1972</span>                .setQualifier(getServerColumn(replicaId))<a name="line.1972"></a>
<span class="sourceLineNo">1973</span>                .setTimestamp(p.getTimestamp())<a name="line.1973"></a>
<span class="sourceLineNo">1974</span>                .setType(Type.Put)<a name="line.1974"></a>
<span class="sourceLineNo">1975</span>                .build())<a name="line.1975"></a>
<span class="sourceLineNo">1976</span>            .add(builder.clear()<a name="line.1976"></a>
<span class="sourceLineNo">1977</span>                .setRow(p.getRow())<a name="line.1977"></a>
<span class="sourceLineNo">1978</span>                .setFamily(getCatalogFamily())<a name="line.1978"></a>
<span class="sourceLineNo">1979</span>                .setQualifier(getStartCodeColumn(replicaId))<a name="line.1979"></a>
<span class="sourceLineNo">1980</span>                .setTimestamp(p.getTimestamp())<a name="line.1980"></a>
<span class="sourceLineNo">1981</span>                .setType(Cell.Type.Put)<a name="line.1981"></a>
<span class="sourceLineNo">1982</span>                .build())<a name="line.1982"></a>
<span class="sourceLineNo">1983</span>            .add(builder.clear()<a name="line.1983"></a>
<span class="sourceLineNo">1984</span>                .setRow(p.getRow())<a name="line.1984"></a>
<span class="sourceLineNo">1985</span>                .setFamily(getCatalogFamily())<a name="line.1985"></a>
<span class="sourceLineNo">1986</span>                .setQualifier(getSeqNumColumn(replicaId))<a name="line.1986"></a>
<span class="sourceLineNo">1987</span>                .setTimestamp(p.getTimestamp())<a name="line.1987"></a>
<span class="sourceLineNo">1988</span>                .setType(Cell.Type.Put)<a name="line.1988"></a>
<span class="sourceLineNo">1989</span>                .build());<a name="line.1989"></a>
<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
<span class="sourceLineNo">1991</span><a name="line.1991"></a>
<span class="sourceLineNo">1992</span>  public static final class ReplicationBarrierResult {<a name="line.1992"></a>
<span class="sourceLineNo">1993</span>    private final long[] barriers;<a name="line.1993"></a>
<span class="sourceLineNo">1994</span>    private final RegionState.State state;<a name="line.1994"></a>
<span class="sourceLineNo">1995</span>    private final List&lt;byte[]&gt; parentRegionNames;<a name="line.1995"></a>
<span class="sourceLineNo">1996</span><a name="line.1996"></a>
<span class="sourceLineNo">1997</span>    ReplicationBarrierResult(long[] barriers, State state, List&lt;byte[]&gt; parentRegionNames) {<a name="line.1997"></a>
<span class="sourceLineNo">1998</span>      this.barriers = barriers;<a name="line.1998"></a>
<span class="sourceLineNo">1999</span>      this.state = state;<a name="line.1999"></a>
<span class="sourceLineNo">2000</span>      this.parentRegionNames = parentRegionNames;<a name="line.2000"></a>
<span class="sourceLineNo">2001</span>    }<a name="line.2001"></a>
<span class="sourceLineNo">2002</span><a name="line.2002"></a>
<span class="sourceLineNo">2003</span>    public long[] getBarriers() {<a name="line.2003"></a>
<span class="sourceLineNo">2004</span>      return barriers;<a name="line.2004"></a>
<span class="sourceLineNo">2005</span>    }<a name="line.2005"></a>
<span class="sourceLineNo">2006</span><a name="line.2006"></a>
<span class="sourceLineNo">2007</span>    public RegionState.State getState() {<a name="line.2007"></a>
<span class="sourceLineNo">2008</span>      return state;<a name="line.2008"></a>
<span class="sourceLineNo">2009</span>    }<a name="line.2009"></a>
<span class="sourceLineNo">2010</span><a name="line.2010"></a>
<span class="sourceLineNo">2011</span>    public List&lt;byte[]&gt; getParentRegionNames() {<a name="line.2011"></a>
<span class="sourceLineNo">2012</span>      return parentRegionNames;<a name="line.2012"></a>
<span class="sourceLineNo">2013</span>    }<a name="line.2013"></a>
<span class="sourceLineNo">2014</span><a name="line.2014"></a>
<span class="sourceLineNo">2015</span>    @Override<a name="line.2015"></a>
<span class="sourceLineNo">2016</span>    public String toString() {<a name="line.2016"></a>
<span class="sourceLineNo">2017</span>      return "ReplicationBarrierResult [barriers=" + Arrays.toString(barriers) + ", state=" +<a name="line.2017"></a>
<span class="sourceLineNo">2018</span>        state + ", parentRegionNames=" +<a name="line.2018"></a>
<span class="sourceLineNo">2019</span>        parentRegionNames.stream().map(Bytes::toStringBinary).collect(Collectors.joining(", ")) +<a name="line.2019"></a>
<span class="sourceLineNo">2020</span>        "]";<a name="line.2020"></a>
<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
<span class="sourceLineNo">2022</span>  }<a name="line.2022"></a>
<span class="sourceLineNo">2023</span><a name="line.2023"></a>
<span class="sourceLineNo">2024</span>  private static long getReplicationBarrier(Cell c) {<a name="line.2024"></a>
<span class="sourceLineNo">2025</span>    return Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength());<a name="line.2025"></a>
<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
<span class="sourceLineNo">2027</span><a name="line.2027"></a>
<span class="sourceLineNo">2028</span>  public static long[] getReplicationBarriers(Result result) {<a name="line.2028"></a>
<span class="sourceLineNo">2029</span>    return result.getColumnCells(HConstants.REPLICATION_BARRIER_FAMILY, HConstants.SEQNUM_QUALIFIER)<a name="line.2029"></a>
<span class="sourceLineNo">2030</span>      .stream().mapToLong(MetaTableAccessor::getReplicationBarrier).sorted().distinct().toArray();<a name="line.2030"></a>
<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
<span class="sourceLineNo">2032</span><a name="line.2032"></a>
<span class="sourceLineNo">2033</span>  private static ReplicationBarrierResult getReplicationBarrierResult(Result result) {<a name="line.2033"></a>
<span class="sourceLineNo">2034</span>    long[] barriers = getReplicationBarriers(result);<a name="line.2034"></a>
<span class="sourceLineNo">2035</span>    byte[] stateBytes = result.getValue(getCatalogFamily(), getRegionStateColumn());<a name="line.2035"></a>
<span class="sourceLineNo">2036</span>    RegionState.State state =<a name="line.2036"></a>
<span class="sourceLineNo">2037</span>      stateBytes != null ? RegionState.State.valueOf(Bytes.toString(stateBytes)) : null;<a name="line.2037"></a>
<span class="sourceLineNo">2038</span>    byte[] parentRegionsBytes =<a name="line.2038"></a>
<span class="sourceLineNo">2039</span>      result.getValue(HConstants.REPLICATION_BARRIER_FAMILY, REPLICATION_PARENT_QUALIFIER);<a name="line.2039"></a>
<span class="sourceLineNo">2040</span>    List&lt;byte[]&gt; parentRegionNames =<a name="line.2040"></a>
<span class="sourceLineNo">2041</span>      parentRegionsBytes != null ? parseParentsBytes(parentRegionsBytes) : Collections.emptyList();<a name="line.2041"></a>
<span class="sourceLineNo">2042</span>    return new ReplicationBarrierResult(barriers, state, parentRegionNames);<a name="line.2042"></a>
<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
<span class="sourceLineNo">2044</span><a name="line.2044"></a>
<span class="sourceLineNo">2045</span>  public static ReplicationBarrierResult getReplicationBarrierResult(Connection conn,<a name="line.2045"></a>
<span class="sourceLineNo">2046</span>      TableName tableName, byte[] row, byte[] encodedRegionName) throws IOException {<a name="line.2046"></a>
<span class="sourceLineNo">2047</span>    byte[] metaStartKey = RegionInfo.createRegionName(tableName, row, HConstants.NINES, false);<a name="line.2047"></a>
<span class="sourceLineNo">2048</span>    byte[] metaStopKey =<a name="line.2048"></a>
<span class="sourceLineNo">2049</span>      RegionInfo.createRegionName(tableName, HConstants.EMPTY_START_ROW, "", false);<a name="line.2049"></a>
<span class="sourceLineNo">2050</span>    Scan scan = new Scan().withStartRow(metaStartKey).withStopRow(metaStopKey)<a name="line.2050"></a>
<span class="sourceLineNo">2051</span>      .addColumn(getCatalogFamily(), getRegionStateColumn())<a name="line.2051"></a>
<span class="sourceLineNo">2052</span>      .addFamily(HConstants.REPLICATION_BARRIER_FAMILY).readAllVersions().setReversed(true)<a name="line.2052"></a>
<span class="sourceLineNo">2053</span>      .setCaching(10);<a name="line.2053"></a>
<span class="sourceLineNo">2054</span>    try (Table table = getMetaHTable(conn); ResultScanner scanner = table.getScanner(scan)) {<a name="line.2054"></a>
<span class="sourceLineNo">2055</span>      for (Result result;;) {<a name="line.2055"></a>
<span class="sourceLineNo">2056</span>        result = scanner.next();<a name="line.2056"></a>
<span class="sourceLineNo">2057</span>        if (result == null) {<a name="line.2057"></a>
<span class="sourceLineNo">2058</span>          return new ReplicationBarrierResult(new long[0], null, Collections.emptyList());<a name="line.2058"></a>
<span class="sourceLineNo">2059</span>        }<a name="line.2059"></a>
<span class="sourceLineNo">2060</span>        byte[] regionName = result.getRow();<a name="line.2060"></a>
<span class="sourceLineNo">2061</span>        // TODO: we may look up a region which has already been split or merged so we need to check<a name="line.2061"></a>
<span class="sourceLineNo">2062</span>        // whether the encoded name matches. Need to find a way to quit earlier when there is no<a name="line.2062"></a>
<span class="sourceLineNo">2063</span>        // record for the given region, for now it will scan to the end of the table.<a name="line.2063"></a>
<span class="sourceLineNo">2064</span>        if (!Bytes.equals(encodedRegionName,<a name="line.2064"></a>
<span class="sourceLineNo">2065</span>          Bytes.toBytes(RegionInfo.encodeRegionName(regionName)))) {<a name="line.2065"></a>
<span class="sourceLineNo">2066</span>          continue;<a name="line.2066"></a>
<span class="sourceLineNo">2067</span>        }<a name="line.2067"></a>
<span class="sourceLineNo">2068</span>        return getReplicationBarrierResult(result);<a name="line.2068"></a>
<span class="sourceLineNo">2069</span>      }<a name="line.2069"></a>
<span class="sourceLineNo">2070</span>    }<a name="line.2070"></a>
<span class="sourceLineNo">2071</span>  }<a name="line.2071"></a>
<span class="sourceLineNo">2072</span><a name="line.2072"></a>
<span class="sourceLineNo">2073</span>  public static long[] getReplicationBarrier(Connection conn, byte[] regionName)<a name="line.2073"></a>
<span class="sourceLineNo">2074</span>      throws IOException {<a name="line.2074"></a>
<span class="sourceLineNo">2075</span>    try (Table table = getMetaHTable(conn)) {<a name="line.2075"></a>
<span class="sourceLineNo">2076</span>      Result result = table.get(new Get(regionName)<a name="line.2076"></a>
<span class="sourceLineNo">2077</span>        .addColumn(HConstants.REPLICATION_BARRIER_FAMILY, HConstants.SEQNUM_QUALIFIER)<a name="line.2077"></a>
<span class="sourceLineNo">2078</span>        .readAllVersions());<a name="line.2078"></a>
<span class="sourceLineNo">2079</span>      return getReplicationBarriers(result);<a name="line.2079"></a>
<span class="sourceLineNo">2080</span>    }<a name="line.2080"></a>
<span class="sourceLineNo">2081</span>  }<a name="line.2081"></a>
<span class="sourceLineNo">2082</span><a name="line.2082"></a>
<span class="sourceLineNo">2083</span>  public static List&lt;Pair&lt;String, Long&gt;&gt; getTableEncodedRegionNameAndLastBarrier(Connection conn,<a name="line.2083"></a>
<span class="sourceLineNo">2084</span>      TableName tableName) throws IOException {<a name="line.2084"></a>
<span class="sourceLineNo">2085</span>    List&lt;Pair&lt;String, Long&gt;&gt; list = new ArrayList&lt;&gt;();<a name="line.2085"></a>
<span class="sourceLineNo">2086</span>    scanMeta(conn, getTableStartRowForMeta(tableName, QueryType.REPLICATION),<a name="line.2086"></a>
<span class="sourceLineNo">2087</span>      getTableStopRowForMeta(tableName, QueryType.REPLICATION), QueryType.REPLICATION, r -&gt; {<a name="line.2087"></a>
<span class="sourceLineNo">2088</span>        byte[] value =<a name="line.2088"></a>
<span class="sourceLineNo">2089</span>          r.getValue(HConstants.REPLICATION_BARRIER_FAMILY, HConstants.SEQNUM_QUALIFIER);<a name="line.2089"></a>
<span class="sourceLineNo">2090</span>        if (value == null) {<a name="line.2090"></a>
<span class="sourceLineNo">2091</span>          return true;<a name="line.2091"></a>
<span class="sourceLineNo">2092</span>        }<a name="line.2092"></a>
<span class="sourceLineNo">2093</span>        long lastBarrier = Bytes.toLong(value);<a name="line.2093"></a>
<span class="sourceLineNo">2094</span>        String encodedRegionName = RegionInfo.encodeRegionName(r.getRow());<a name="line.2094"></a>
<span class="sourceLineNo">2095</span>        list.add(Pair.newPair(encodedRegionName, lastBarrier));<a name="line.2095"></a>
<span class="sourceLineNo">2096</span>        return true;<a name="line.2096"></a>
<span class="sourceLineNo">2097</span>      });<a name="line.2097"></a>
<span class="sourceLineNo">2098</span>    return list;<a name="line.2098"></a>
<span class="sourceLineNo">2099</span>  }<a name="line.2099"></a>
<span class="sourceLineNo">2100</span><a name="line.2100"></a>
<span class="sourceLineNo">2101</span>  public static List&lt;String&gt; getTableEncodedRegionNamesForSerialReplication(Connection conn,<a name="line.2101"></a>
<span class="sourceLineNo">2102</span>      TableName tableName) throws IOException {<a name="line.2102"></a>
<span class="sourceLineNo">2103</span>    List&lt;String&gt; list = new ArrayList&lt;&gt;();<a name="line.2103"></a>
<span class="sourceLineNo">2104</span>    scanMeta(conn, getTableStartRowForMeta(tableName, QueryType.REPLICATION),<a name="line.2104"></a>
<span class="sourceLineNo">2105</span>      getTableStopRowForMeta(tableName, QueryType.REPLICATION), QueryType.REPLICATION,<a name="line.2105"></a>
<span class="sourceLineNo">2106</span>      new FirstKeyOnlyFilter(), Integer.MAX_VALUE, r -&gt; {<a name="line.2106"></a>
<span class="sourceLineNo">2107</span>        list.add(RegionInfo.encodeRegionName(r.getRow()));<a name="line.2107"></a>
<span class="sourceLineNo">2108</span>        return true;<a name="line.2108"></a>
<span class="sourceLineNo">2109</span>      });<a name="line.2109"></a>
<span class="sourceLineNo">2110</span>    return list;<a name="line.2110"></a>
<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
<span class="sourceLineNo">2112</span><a name="line.2112"></a>
<span class="sourceLineNo">2113</span>  private static void debugLogMutations(List&lt;? extends Mutation&gt; mutations) throws IOException {<a name="line.2113"></a>
<span class="sourceLineNo">2114</span>    if (!METALOG.isDebugEnabled()) {<a name="line.2114"></a>
<span class="sourceLineNo">2115</span>      return;<a name="line.2115"></a>
<span class="sourceLineNo">2116</span>    }<a name="line.2116"></a>
<span class="sourceLineNo">2117</span>    // Logging each mutation in separate line makes it easier to see diff between them visually<a name="line.2117"></a>
<span class="sourceLineNo">2118</span>    // because of common starting indentation.<a name="line.2118"></a>
<span class="sourceLineNo">2119</span>    for (Mutation mutation : mutations) {<a name="line.2119"></a>
<span class="sourceLineNo">2120</span>      debugLogMutation(mutation);<a name="line.2120"></a>
<span class="sourceLineNo">2121</span>    }<a name="line.2121"></a>
<span class="sourceLineNo">2122</span>  }<a name="line.2122"></a>
<span class="sourceLineNo">2123</span><a name="line.2123"></a>
<span class="sourceLineNo">2124</span>  private static void debugLogMutation(Mutation p) throws IOException {<a name="line.2124"></a>
<span class="sourceLineNo">2125</span>    METALOG.debug("{} {}", p.getClass().getSimpleName(), p.toJSON());<a name="line.2125"></a>
<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
<span class="sourceLineNo">2127</span><a name="line.2127"></a>
<span class="sourceLineNo">2128</span>  private static Put addSequenceNum(Put p, long openSeqNum, int replicaId) throws IOException {<a name="line.2128"></a>
<span class="sourceLineNo">2129</span>    return p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.2129"></a>
<span class="sourceLineNo">2130</span>              .setRow(p.getRow())<a name="line.2130"></a>
<span class="sourceLineNo">2131</span>              .setFamily(HConstants.CATALOG_FAMILY)<a name="line.2131"></a>
<span class="sourceLineNo">2132</span>              .setQualifier(getSeqNumColumn(replicaId))<a name="line.2132"></a>
<span class="sourceLineNo">2133</span>              .setTimestamp(p.getTimestamp())<a name="line.2133"></a>
<span class="sourceLineNo">2134</span>              .setType(Type.Put)<a name="line.2134"></a>
<span class="sourceLineNo">2135</span>              .setValue(Bytes.toBytes(openSeqNum))<a name="line.2135"></a>
<span class="sourceLineNo">2136</span>              .build());<a name="line.2136"></a>
<span class="sourceLineNo">2137</span>  }<a name="line.2137"></a>
<span class="sourceLineNo">2138</span>}<a name="line.2138"></a>




























































</pre>
</div>
</body>
</html>
