You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/07/22 09:30:39 UTC

[01/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 972a3c890 -> df8fd1d31


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html
index 3d7093a..9917ee8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html
@@ -39,594 +39,612 @@
 <span class="sourceLineNo">031</span>import java.util.concurrent.ThreadPoolExecutor;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.TimeUnit;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.Path;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.TableName;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ClusterConnection;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionAdminServiceCallable;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RegionInfo;<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.RetryingCallable;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RpcRetryingCallerFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.ipc.HBaseRpcController;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.replication.WALEntryFilter;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.wal.WALSplitter.EntryBuffers;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.wal.WALSplitter.OutputSink;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.wal.WALSplitter.PipelineController;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.wal.WALSplitter.RegionEntryBuffer;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.wal.WALSplitter.SinkWriter;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.util.StringUtils;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.slf4j.Logger;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.slf4j.LoggerFactory;<a name="line.72"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.conf.Configuration;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.Path;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HConstants;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableName;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.ClusterConnection;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.RegionAdminServiceCallable;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RetryingCallable;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.RpcRetryingCallerFactory;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.ipc.HBaseRpcController;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.replication.WALEntryFilter;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.wal.WALSplitter.EntryBuffers;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.wal.WALSplitter.OutputSink;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.wal.WALSplitter.PipelineController;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.wal.WALSplitter.RegionEntryBuffer;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.wal.WALSplitter.SinkWriter;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.util.StringUtils;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.slf4j.Logger;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.slf4j.LoggerFactory;<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
 <span class="sourceLineNo">073</span>import org.apache.hbase.thirdparty.com.google.common.cache.Cache;<a name="line.73"></a>
 <span class="sourceLineNo">074</span>import org.apache.hbase.thirdparty.com.google.common.cache.CacheBuilder;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse;<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>/**<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * A {@link org.apache.hadoop.hbase.replication.ReplicationEndpoint} endpoint<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * which receives the WAL edits from the WAL, and sends the edits to replicas<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * of regions.<a name="line.81"></a>
-<span class="sourceLineNo">082</span> */<a name="line.82"></a>
-<span class="sourceLineNo">083</span>@InterfaceAudience.Private<a name="line.83"></a>
-<span class="sourceLineNo">084</span>public class RegionReplicaReplicationEndpoint extends HBaseReplicationEndpoint {<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private static final Logger LOG = LoggerFactory.getLogger(RegionReplicaReplicationEndpoint.class);<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  // Can be configured differently than hbase.client.retries.number<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private static String CLIENT_RETRIES_NUMBER<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    = "hbase.region.replica.replication.client.retries.number";<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private Configuration conf;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private ClusterConnection connection;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private TableDescriptors tableDescriptors;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>  // Reuse WALSplitter constructs as a WAL pipe<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private PipelineController controller;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private RegionReplicaOutputSink outputSink;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private EntryBuffers entryBuffers;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  // Number of writer threads<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private int numWriterThreads;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private int operationTimeout;<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private ExecutorService pool;<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void init(Context context) throws IOException {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    super.init(context);<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    this.conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    this.tableDescriptors = context.getTableDescriptors();<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // HRS multiplies client retries by 10 globally for meta operations, but we do not want this.<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    // We are resetting it here because we want default number of retries (35) rather than 10 times<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // that which makes very long retries for disabled tables etc.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    int defaultNumRetries = conf.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (defaultNumRetries &gt; 10) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      int mult = conf.getInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        HConstants.DEFAULT_HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      defaultNumRetries = defaultNumRetries / mult; // reset if HRS has multiplied this already<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    }<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>    conf.setInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER, 1);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    int numRetries = conf.getInt(CLIENT_RETRIES_NUMBER, defaultNumRetries);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, numRetries);<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this.numWriterThreads = this.conf.getInt(<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      "hbase.region.replica.replication.writer.threads", 3);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    controller = new PipelineController();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    entryBuffers = new EntryBuffers(controller,<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.conf.getInt("hbase.region.replica.replication.buffersize",<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          128*1024*1024));<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // use the regular RPC timeout for replica replication RPC's<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    this.operationTimeout = conf.getInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT,<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  @Override<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  protected void doStart() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    try {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      connection = (ClusterConnection) ConnectionFactory.createConnection(this.conf);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      this.pool = getDefaultThreadPool(conf);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      outputSink = new RegionReplicaOutputSink(controller, tableDescriptors, entryBuffers,<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        connection, pool, numWriterThreads, operationTimeout);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      outputSink.startWriterThreads();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      super.doStart();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    } catch (IOException ex) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.warn("Received exception while creating connection :" + ex);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      notifyFailed(ex);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  protected void doStop() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    if (outputSink != null) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      try {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        outputSink.finishWritingAndClose();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      } catch (IOException ex) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        LOG.warn("Got exception while trying to close OutputSink", ex);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    if (this.pool != null) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      this.pool.shutdownNow();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      try {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        // wait for 10 sec<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        boolean shutdown = this.pool.awaitTermination(10000, TimeUnit.MILLISECONDS);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        if (!shutdown) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          LOG.warn("Failed to shutdown the thread pool after 10 seconds");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      } catch (InterruptedException e) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        LOG.warn("Got interrupted while waiting for the thread pool to shut down" + e);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      }<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    if (connection != null) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      try {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        connection.close();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      } catch (IOException ex) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        LOG.warn("Got exception closing connection :" + ex);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    super.doStop();<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>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Returns a Thread pool for the RPC's to region replicas. Similar to<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * Connection's thread pool.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   */<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private ExecutorService getDefaultThreadPool(Configuration conf) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    int maxThreads = conf.getInt("hbase.region.replica.replication.threads.max", 256);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (maxThreads == 0) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      maxThreads = Runtime.getRuntime().availableProcessors() * 8;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    long keepAliveTime = conf.getLong("hbase.region.replica.replication.threads.keepalivetime", 60);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    LinkedBlockingQueue&lt;Runnable&gt; workQueue =<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        new LinkedBlockingQueue&lt;&gt;(maxThreads *<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,<a name="line.200"></a>
-<span class="sourceLineNo">201</span>              HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS));<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ThreadPoolExecutor tpe = new ThreadPoolExecutor(<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      maxThreads,<a name="line.203"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>/**<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * A {@link org.apache.hadoop.hbase.replication.ReplicationEndpoint} endpoint<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * which receives the WAL edits from the WAL, and sends the edits to replicas<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * of regions.<a name="line.82"></a>
+<span class="sourceLineNo">083</span> */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>@InterfaceAudience.Private<a name="line.84"></a>
+<span class="sourceLineNo">085</span>public class RegionReplicaReplicationEndpoint extends HBaseReplicationEndpoint {<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final Logger LOG = LoggerFactory.getLogger(RegionReplicaReplicationEndpoint.class);<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  // Can be configured differently than hbase.client.retries.number<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private static String CLIENT_RETRIES_NUMBER<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    = "hbase.region.replica.replication.client.retries.number";<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private Configuration conf;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private ClusterConnection connection;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private TableDescriptors tableDescriptors;<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  // Reuse WALSplitter constructs as a WAL pipe<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private PipelineController controller;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  private RegionReplicaOutputSink outputSink;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private EntryBuffers entryBuffers;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  // Number of writer threads<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private int numWriterThreads;<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private int operationTimeout;<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private ExecutorService pool;<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Override<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void init(Context context) throws IOException {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    super.init(context);<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    this.conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    this.tableDescriptors = context.getTableDescriptors();<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // HRS multiplies client retries by 10 globally for meta operations, but we do not want this.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // We are resetting it here because we want default number of retries (35) rather than 10 times<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // that which makes very long retries for disabled tables etc.<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    int defaultNumRetries = conf.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    if (defaultNumRetries &gt; 10) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      int mult = conf.getInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        HConstants.DEFAULT_HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      defaultNumRetries = defaultNumRetries / mult; // reset if HRS has multiplied this already<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>    conf.setInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER, 1);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    int numRetries = conf.getInt(CLIENT_RETRIES_NUMBER, defaultNumRetries);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, numRetries);<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    this.numWriterThreads = this.conf.getInt(<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      "hbase.region.replica.replication.writer.threads", 3);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    controller = new PipelineController();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    entryBuffers = new EntryBuffers(controller,<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.conf.getInt("hbase.region.replica.replication.buffersize",<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          128*1024*1024));<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>    // use the regular RPC timeout for replica replication RPC's<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.operationTimeout = conf.getInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  protected void doStart() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      connection = (ClusterConnection) ConnectionFactory.createConnection(this.conf);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      this.pool = getDefaultThreadPool(conf);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      outputSink = new RegionReplicaOutputSink(controller, tableDescriptors, entryBuffers,<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        connection, pool, numWriterThreads, operationTimeout);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      outputSink.startWriterThreads();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      super.doStart();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    } catch (IOException ex) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      LOG.warn("Received exception while creating connection :" + ex);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      notifyFailed(ex);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  @Override<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  protected void doStop() {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    if (outputSink != null) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      try {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        outputSink.finishWritingAndClose();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      } catch (IOException ex) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        LOG.warn("Got exception while trying to close OutputSink", ex);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    if (this.pool != null) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      this.pool.shutdownNow();<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      try {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        // wait for 10 sec<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        boolean shutdown = this.pool.awaitTermination(10000, TimeUnit.MILLISECONDS);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        if (!shutdown) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          LOG.warn("Failed to shutdown the thread pool after 10 seconds");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      } catch (InterruptedException e) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        LOG.warn("Got interrupted while waiting for the thread pool to shut down" + e);<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>    if (connection != null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      try {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        connection.close();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      } catch (IOException ex) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        LOG.warn("Got exception closing connection :" + ex);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    super.doStop();<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Returns a Thread pool for the RPC's to region replicas. Similar to<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Connection's thread pool.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private ExecutorService getDefaultThreadPool(Configuration conf) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    int maxThreads = conf.getInt("hbase.region.replica.replication.threads.max", 256);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    if (maxThreads == 0) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      maxThreads = Runtime.getRuntime().availableProcessors() * 8;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    long keepAliveTime = conf.getLong("hbase.region.replica.replication.threads.keepalivetime", 60);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    LinkedBlockingQueue&lt;Runnable&gt; workQueue =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        new LinkedBlockingQueue&lt;&gt;(maxThreads *<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,<a name="line.201"></a>
+<span class="sourceLineNo">202</span>              HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS));<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ThreadPoolExecutor tpe = new ThreadPoolExecutor(<a name="line.203"></a>
 <span class="sourceLineNo">204</span>      maxThreads,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      keepAliveTime,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      TimeUnit.SECONDS,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      workQueue,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      Threads.newDaemonThreadFactory(this.getClass().getSimpleName() + "-rpc-shared-"));<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    tpe.allowCoreThreadTimeOut(true);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return tpe;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  @Override<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  public boolean replicate(ReplicateContext replicateContext) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    /* A note on batching in RegionReplicaReplicationEndpoint (RRRE):<a name="line.215"></a>
-<span class="sourceLineNo">216</span>     *<a name="line.216"></a>
-<span class="sourceLineNo">217</span>     * RRRE relies on batching from two different mechanisms. The first is the batching from<a name="line.217"></a>
-<span class="sourceLineNo">218</span>     * ReplicationSource since RRRE is a ReplicationEndpoint driven by RS. RS reads from a single<a name="line.218"></a>
-<span class="sourceLineNo">219</span>     * WAL file filling up a buffer of heap size "replication.source.size.capacity"(64MB) or at most<a name="line.219"></a>
-<span class="sourceLineNo">220</span>     * "replication.source.nb.capacity" entries or until it sees the end of file (in live tailing).<a name="line.220"></a>
-<span class="sourceLineNo">221</span>     * Then RS passes all the buffered edits in this replicate() call context. RRRE puts the edits<a name="line.221"></a>
-<span class="sourceLineNo">222</span>     * to the WALSplitter.EntryBuffers which is a blocking buffer space of up to<a name="line.222"></a>
-<span class="sourceLineNo">223</span>     * "hbase.region.replica.replication.buffersize" (128MB) in size. This buffer splits the edits<a name="line.223"></a>
-<span class="sourceLineNo">224</span>     * based on regions.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>     *<a name="line.225"></a>
-<span class="sourceLineNo">226</span>     * There are "hbase.region.replica.replication.writer.threads"(default 3) writer threads which<a name="line.226"></a>
-<span class="sourceLineNo">227</span>     * pick largest per-region buffer and send it to the SinkWriter (see RegionReplicaOutputSink).<a name="line.227"></a>
-<span class="sourceLineNo">228</span>     * The SinkWriter in this case will send the wal edits to all secondary region replicas in<a name="line.228"></a>
-<span class="sourceLineNo">229</span>     * parallel via a retrying rpc call. EntryBuffers guarantees that while a buffer is<a name="line.229"></a>
-<span class="sourceLineNo">230</span>     * being written to the sink, another buffer for the same region will not be made available to<a name="line.230"></a>
-<span class="sourceLineNo">231</span>     * writers ensuring regions edits are not replayed out of order.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>     *<a name="line.232"></a>
-<span class="sourceLineNo">233</span>     * The replicate() call won't return until all the buffers are sent and ack'd by the sinks so<a name="line.233"></a>
-<span class="sourceLineNo">234</span>     * that the replication can assume all edits are persisted. We may be able to do a better<a name="line.234"></a>
-<span class="sourceLineNo">235</span>     * pipelining between the replication thread and output sinks later if it becomes a bottleneck.<a name="line.235"></a>
-<span class="sourceLineNo">236</span>     */<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    while (this.isRunning()) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        for (Entry entry: replicateContext.getEntries()) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          entryBuffers.appendEntry(entry);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        outputSink.flush(); // make sure everything is flushed<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        ctx.getMetrics().incrLogEditsFiltered(<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          outputSink.getSkippedEditsCounter().getAndSet(0));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        return true;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      } catch (InterruptedException e) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        Thread.currentThread().interrupt();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        return false;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      } catch (IOException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        LOG.warn("Received IOException while trying to replicate"<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            + StringUtils.stringifyException(e));<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return false;<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>  @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  public boolean canReplicateToSameCluster() {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    return true;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  protected WALEntryFilter getScopeWALEntryFilter() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    // we do not care about scope. We replicate everything.<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return null;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  static class RegionReplicaOutputSink extends OutputSink {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    private final RegionReplicaSinkWriter sinkWriter;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private final TableDescriptors tableDescriptors;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final Cache&lt;TableName, Boolean&gt; memstoreReplicationEnabled;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    public RegionReplicaOutputSink(PipelineController controller, TableDescriptors tableDescriptors,<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        EntryBuffers entryBuffers, ClusterConnection connection, ExecutorService pool,<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        int numWriters, int operationTimeout) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      super(controller, entryBuffers, numWriters);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      this.sinkWriter = new RegionReplicaSinkWriter(this, connection, pool, operationTimeout);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.tableDescriptors = tableDescriptors;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>      // A cache for the table "memstore replication enabled" flag.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      // It has a default expiry of 5 sec. This means that if the table is altered<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      // with a different flag value, we might miss to replicate for that amount of<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      // time. But this cache avoid the slow lookup and parsing of the TableDescriptor.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      int memstoreReplicationEnabledCacheExpiryMs = connection.getConfiguration()<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        .getInt("hbase.region.replica.replication.cache.memstoreReplicationEnabled.expiryMs", 5000);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      this.memstoreReplicationEnabled = CacheBuilder.newBuilder()<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        .expireAfterWrite(memstoreReplicationEnabledCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        .initialCapacity(10)<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        .maximumSize(1000)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        .build();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    @Override<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    public void append(RegionEntryBuffer buffer) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      List&lt;Entry&gt; entries = buffer.getEntryBuffer();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>      if (entries.isEmpty() || entries.get(0).getEdit().getCells().isEmpty()) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        return;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>      // meta edits (e.g. flush) are always replicated.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      // data edits (e.g. put) are replicated if the table requires them.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      if (!requiresReplication(buffer.getTableName(), entries)) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        return;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      sinkWriter.append(buffer.getTableName(), buffer.getEncodedRegionName(),<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        CellUtil.cloneRow(entries.get(0).getEdit().getCells().get(0)), entries);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    @Override<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    public boolean flush() throws IOException {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      // nothing much to do for now. Wait for the Writer threads to finish up<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // append()'ing the data.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      entryBuffers.waitUntilDrained();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      return super.flush();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    @Override<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    public boolean keepRegionEvent(Entry entry) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    public List&lt;Path&gt; finishWritingAndClose() throws IOException {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      finishWriting(true);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      return null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>    @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    public Map&lt;byte[], Long&gt; getOutputCounts() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      return null; // only used in tests<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>    @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    public int getNumberOfRecoveredRegions() {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      return 0;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>    AtomicLong getSkippedEditsCounter() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      return skippedEdits;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>    /**<a name="line.346"></a>
-<span class="sourceLineNo">347</span>     * returns true if the specified entry must be replicated.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>     * We should always replicate meta operations (e.g. flush)<a name="line.348"></a>
-<span class="sourceLineNo">349</span>     * and use the user HTD flag to decide whether or not replicate the memstore.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>     */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    private boolean requiresReplication(final TableName tableName, final List&lt;Entry&gt; entries)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        throws IOException {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      // unit-tests may not the TableDescriptors, bypass the check and always replicate<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      if (tableDescriptors == null) return true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>      Boolean requiresReplication = memstoreReplicationEnabled.getIfPresent(tableName);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      if (requiresReplication == null) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        // check if the table requires memstore replication<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        // some unit-test drop the table, so we should do a bypass check and always replicate.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        TableDescriptor htd = tableDescriptors.get(tableName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        requiresReplication = htd == null || htd.hasRegionMemStoreReplication();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        memstoreReplicationEnabled.put(tableName, requiresReplication);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>      // if memstore replication is not required, check the entries.<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      // meta edits (e.g. flush) must be always replicated.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      if (!requiresReplication) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        int skipEdits = 0;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        java.util.Iterator&lt;Entry&gt; it = entries.iterator();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        while (it.hasNext()) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          Entry entry = it.next();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          if (entry.getEdit().isMetaEdit()) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>            requiresReplication = true;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>            it.remove();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            skipEdits++;<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>        skippedEdits.addAndGet(skipEdits);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      return requiresReplication;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    }<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  }<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>  static class RegionReplicaSinkWriter extends SinkWriter {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    RegionReplicaOutputSink sink;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    ClusterConnection connection;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    RpcControllerFactory rpcControllerFactory;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    RpcRetryingCallerFactory rpcRetryingCallerFactory;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    int operationTimeout;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    ExecutorService pool;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Cache&lt;TableName, Boolean&gt; disabledAndDroppedTables;<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>    public RegionReplicaSinkWriter(RegionReplicaOutputSink sink, ClusterConnection connection,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        ExecutorService pool, int operationTimeout) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      this.sink = sink;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      this.connection = connection;<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      this.operationTimeout = operationTimeout;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      this.rpcRetryingCallerFactory<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        = RpcRetryingCallerFactory.instantiate(connection.getConfiguration());<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      this.rpcControllerFactory = RpcControllerFactory.instantiate(connection.getConfiguration());<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      this.pool = pool;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>      int nonExistentTableCacheExpiryMs = connection.getConfiguration()<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        .getInt("hbase.region.replica.replication.cache.disabledAndDroppedTables.expiryMs", 5000);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      // A cache for non existing tables that have a default expiry of 5 sec. This means that if the<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      // table is created again with the same name, we might miss to replicate for that amount of<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      // time. But this cache prevents overloading meta requests for every edit from a deleted file.<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      disabledAndDroppedTables = CacheBuilder.newBuilder()<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        .expireAfterWrite(nonExistentTableCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        .initialCapacity(10)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        .maximumSize(1000)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        .build();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>    public void append(TableName tableName, byte[] encodedRegionName, byte[] row,<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        List&lt;Entry&gt; entries) throws IOException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      if (disabledAndDroppedTables.getIfPresent(tableName) != null) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        if (LOG.isTraceEnabled()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            + " is cached as a disabled or dropped table");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          for (Entry entry : entries) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            LOG.trace("Skipping : " + entry);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          }<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>      // If the table is disabled or dropped, we should not replay the entries, and we can skip<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      // replaying them. However, we might not know whether the table is disabled until we<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      // invalidate the cache and check from meta<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      RegionLocations locations = null;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      boolean useCache = true;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      while (true) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        // get the replicas of the primary region<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          locations = RegionReplicaReplayCallable<a name="line.439"></a>
-<span class="sourceLineNo">440</span>              .getRegionLocations(connection, tableName, row, useCache, 0);<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>          if (locations == null) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>            throw new HBaseIOException("Cannot locate locations for "<a name="line.443"></a>
-<span class="sourceLineNo">444</span>                + tableName + ", row:" + Bytes.toStringBinary(row));<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        } catch (TableNotFoundException e) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          if (LOG.isTraceEnabled()) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.448"></a>
-<span class="sourceLineNo">449</span>              + " is dropped. Adding table to cache.");<a name="line.449"></a>
-<span class="sourceLineNo">450</span>            for (Entry entry : entries) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              LOG.trace("Skipping : " + entry);<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>          disabledAndDroppedTables.put(tableName, Boolean.TRUE); // put to cache. Value ignored<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          // skip this entry<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.456"></a>
-<span class="sourceLineNo">457</span>          return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>        // check whether we should still replay this entry. If the regions are changed, or the<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        // entry is not coming from the primary region, filter it out.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        HRegionLocation primaryLocation = locations.getDefaultRegionLocation();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        if (!Bytes.equals(primaryLocation.getRegionInfo().getEncodedNameAsBytes(),<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          encodedRegionName)) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          if (useCache) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>            useCache = false;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>            continue; // this will retry location lookup<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>            LOG.trace("Skipping " + entries.size() + " entries in table " + tableName<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              + " because located region " + primaryLocation.getRegionInfo().getEncodedName()<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              + " is different than the original region " + Bytes.toStringBinary(encodedRegionName)<a name="line.472"></a>
-<span class="sourceLineNo">473</span>              + " from WALEdit");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            for (Entry entry : entries) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>              LOG.trace("Skipping : " + entry);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>            }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          return;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>      if (locations.size() == 1) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>        return;<a name="line.485"></a>
+<span class="sourceLineNo">205</span>      maxThreads,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      keepAliveTime,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      TimeUnit.SECONDS,<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      workQueue,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      Threads.newDaemonThreadFactory(this.getClass().getSimpleName() + "-rpc-shared-"));<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    tpe.allowCoreThreadTimeOut(true);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return tpe;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  public boolean replicate(ReplicateContext replicateContext) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    /* A note on batching in RegionReplicaReplicationEndpoint (RRRE):<a name="line.216"></a>
+<span class="sourceLineNo">217</span>     *<a name="line.217"></a>
+<span class="sourceLineNo">218</span>     * RRRE relies on batching from two different mechanisms. The first is the batching from<a name="line.218"></a>
+<span class="sourceLineNo">219</span>     * ReplicationSource since RRRE is a ReplicationEndpoint driven by RS. RS reads from a single<a name="line.219"></a>
+<span class="sourceLineNo">220</span>     * WAL file filling up a buffer of heap size "replication.source.size.capacity"(64MB) or at most<a name="line.220"></a>
+<span class="sourceLineNo">221</span>     * "replication.source.nb.capacity" entries or until it sees the end of file (in live tailing).<a name="line.221"></a>
+<span class="sourceLineNo">222</span>     * Then RS passes all the buffered edits in this replicate() call context. RRRE puts the edits<a name="line.222"></a>
+<span class="sourceLineNo">223</span>     * to the WALSplitter.EntryBuffers which is a blocking buffer space of up to<a name="line.223"></a>
+<span class="sourceLineNo">224</span>     * "hbase.region.replica.replication.buffersize" (128MB) in size. This buffer splits the edits<a name="line.224"></a>
+<span class="sourceLineNo">225</span>     * based on regions.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>     *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>     * There are "hbase.region.replica.replication.writer.threads"(default 3) writer threads which<a name="line.227"></a>
+<span class="sourceLineNo">228</span>     * pick largest per-region buffer and send it to the SinkWriter (see RegionReplicaOutputSink).<a name="line.228"></a>
+<span class="sourceLineNo">229</span>     * The SinkWriter in this case will send the wal edits to all secondary region replicas in<a name="line.229"></a>
+<span class="sourceLineNo">230</span>     * parallel via a retrying rpc call. EntryBuffers guarantees that while a buffer is<a name="line.230"></a>
+<span class="sourceLineNo">231</span>     * being written to the sink, another buffer for the same region will not be made available to<a name="line.231"></a>
+<span class="sourceLineNo">232</span>     * writers ensuring regions edits are not replayed out of order.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>     *<a name="line.233"></a>
+<span class="sourceLineNo">234</span>     * The replicate() call won't return until all the buffers are sent and ack'd by the sinks so<a name="line.234"></a>
+<span class="sourceLineNo">235</span>     * that the replication can assume all edits are persisted. We may be able to do a better<a name="line.235"></a>
+<span class="sourceLineNo">236</span>     * pipelining between the replication thread and output sinks later if it becomes a bottleneck.<a name="line.236"></a>
+<span class="sourceLineNo">237</span>     */<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    while (this.isRunning()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        for (Entry entry: replicateContext.getEntries()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          entryBuffers.appendEntry(entry);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        outputSink.flush(); // make sure everything is flushed<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        ctx.getMetrics().incrLogEditsFiltered(<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          outputSink.getSkippedEditsCounter().getAndSet(0));<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        return true;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      } catch (InterruptedException e) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        Thread.currentThread().interrupt();<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        return false;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      } catch (IOException e) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        LOG.warn("Received IOException while trying to replicate"<a name="line.252"></a>
+<span class="sourceLineNo">253</span>            + StringUtils.stringifyException(e));<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    return false;<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>  @Override<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public boolean canReplicateToSameCluster() {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    return true;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected WALEntryFilter getScopeWALEntryFilter() {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // we do not care about scope. We replicate everything.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    return null;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  static class RegionReplicaOutputSink extends OutputSink {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    private final RegionReplicaSinkWriter sinkWriter;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private final TableDescriptors tableDescriptors;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private final Cache&lt;TableName, Boolean&gt; memstoreReplicationEnabled;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    public RegionReplicaOutputSink(PipelineController controller, TableDescriptors tableDescriptors,<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        EntryBuffers entryBuffers, ClusterConnection connection, ExecutorService pool,<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        int numWriters, int operationTimeout) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      super(controller, entryBuffers, numWriters);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      this.sinkWriter =<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          new RegionReplicaSinkWriter(this, connection, pool, operationTimeout, tableDescriptors);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      this.tableDescriptors = tableDescriptors;<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>      // A cache for the table "memstore replication enabled" flag.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      // It has a default expiry of 5 sec. This means that if the table is altered<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // with a different flag value, we might miss to replicate for that amount of<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // time. But this cache avoid the slow lookup and parsing of the TableDescriptor.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      int memstoreReplicationEnabledCacheExpiryMs = connection.getConfiguration()<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        .getInt("hbase.region.replica.replication.cache.memstoreReplicationEnabled.expiryMs", 5000);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.memstoreReplicationEnabled = CacheBuilder.newBuilder()<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        .expireAfterWrite(memstoreReplicationEnabledCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        .initialCapacity(10)<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        .maximumSize(1000)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        .build();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    public void append(RegionEntryBuffer buffer) throws IOException {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      List&lt;Entry&gt; entries = buffer.getEntryBuffer();<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>      if (entries.isEmpty() || entries.get(0).getEdit().getCells().isEmpty()) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        return;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>      // meta edits (e.g. flush) are always replicated.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      // data edits (e.g. put) are replicated if the table requires them.<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      if (!requiresReplication(buffer.getTableName(), entries)) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        return;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>      sinkWriter.append(buffer.getTableName(), buffer.getEncodedRegionName(),<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        CellUtil.cloneRow(entries.get(0).getEdit().getCells().get(0)), entries);<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>    @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    public boolean flush() throws IOException {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // nothing much to do for now. Wait for the Writer threads to finish up<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // append()'ing the data.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      entryBuffers.waitUntilDrained();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      return super.flush();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>    @Override<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    public boolean keepRegionEvent(Entry entry) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      return true;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>    @Override<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    public List&lt;Path&gt; finishWritingAndClose() throws IOException {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      finishWriting(true);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      return null;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    @Override<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    public Map&lt;byte[], Long&gt; getOutputCounts() {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      return null; // only used in tests<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    public int getNumberOfRecoveredRegions() {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      return 0;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>    AtomicLong getSkippedEditsCounter() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      return skippedEdits;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>    /**<a name="line.348"></a>
+<span class="sourceLineNo">349</span>     * returns true if the specified entry must be replicated.<a name="line.349"></a>
+<span class="sourceLineNo">350</span>     * We should always replicate meta operations (e.g. flush)<a name="line.350"></a>
+<span class="sourceLineNo">351</span>     * and use the user HTD flag to decide whether or not replicate the memstore.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>     */<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    private boolean requiresReplication(final TableName tableName, final List&lt;Entry&gt; entries)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        throws IOException {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      // unit-tests may not the TableDescriptors, bypass the check and always replicate<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      if (tableDescriptors == null) return true;<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Boolean requiresReplication = memstoreReplicationEnabled.getIfPresent(tableName);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      if (requiresReplication == null) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        // check if the table requires memstore replication<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        // some unit-test drop the table, so we should do a bypass check and always replicate.<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        TableDescriptor htd = tableDescriptors.get(tableName);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        requiresReplication = htd == null || htd.hasRegionMemStoreReplication();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        memstoreReplicationEnabled.put(tableName, requiresReplication);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>      // if memstore replication is not required, check the entries.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // meta edits (e.g. flush) must be always replicated.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      if (!requiresReplication) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        int skipEdits = 0;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        java.util.Iterator&lt;Entry&gt; it = entries.iterator();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        while (it.hasNext()) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          Entry entry = it.next();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          if (entry.getEdit().isMetaEdit()) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>            requiresReplication = true;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          } else {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            it.remove();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            skipEdits++;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        }<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        skippedEdits.addAndGet(skipEdits);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      }<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      return requiresReplication;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  static class RegionReplicaSinkWriter extends SinkWriter {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    RegionReplicaOutputSink sink;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    ClusterConnection connection;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    RpcControllerFactory rpcControllerFactory;<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    RpcRetryingCallerFactory rpcRetryingCallerFactory;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    int operationTimeout;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    ExecutorService pool;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    Cache&lt;TableName, Boolean&gt; disabledAndDroppedTables;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    TableDescriptors tableDescriptors;<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    public RegionReplicaSinkWriter(RegionReplicaOutputSink sink, ClusterConnection connection,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        ExecutorService pool, int operationTimeout, TableDescriptors tableDescriptors) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      this.sink = sink;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      this.connection = connection;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      this.operationTimeout = operationTimeout;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      this.rpcRetryingCallerFactory<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        = RpcRetryingCallerFactory.instantiate(connection.getConfiguration());<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      this.rpcControllerFactory = RpcControllerFactory.instantiate(connection.getConfiguration());<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      this.pool = pool;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      this.tableDescriptors = tableDescriptors;<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      int nonExistentTableCacheExpiryMs = connection.getConfiguration()<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        .getInt("hbase.region.replica.replication.cache.disabledAndDroppedTables.expiryMs", 5000);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // A cache for non existing tables that have a default expiry of 5 sec. This means that if the<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      // table is created again with the same name, we might miss to replicate for that amount of<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      // time. But this cache prevents overloading meta requests for every edit from a deleted file.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      disabledAndDroppedTables = CacheBuilder.newBuilder()<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        .expireAfterWrite(nonExistentTableCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        .initialCapacity(10)<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        .maximumSize(1000)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        .build();<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>    public void append(TableName tableName, byte[] encodedRegionName, byte[] row,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        List&lt;Entry&gt; entries) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>      if (disabledAndDroppedTables.getIfPresent(tableName) != null) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        if (LOG.isTraceEnabled()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.425"></a>
+<span class="sourceLineNo">426</span>            + " is cached as a disabled or dropped table");<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          for (Entry entry : entries) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            LOG.trace("Skipping : " + entry);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>      // If the table is disabled or dropped, we should not replay the entries, and we can skip<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      // replaying them. However, we might not know whether the table is disabled until we<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      // invalidate the cache and check from meta<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      RegionLocations locations = null;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      boolean useCache = true;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      while (true) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        // get the replicas of the primary region<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        try {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          locations = RegionReplicaReplayCallable<a name="line.443"></a>
+<span class="sourceLineNo">444</span>              .getRegionLocations(connection, tableName, row, useCache, 0);<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>          if (locations == null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>

<TRUNCATED>

[15/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a

<TRUNCATED>

[36/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html
index 5f41fe7..c8158b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html
@@ -524,636 +524,639 @@
 <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><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      if (!node.getTable().equals(tableName)) break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      regions.add(node);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return regions;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      if (!node.getTable().equals(tableName)) break;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      regions.add(node.toRegionState());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return regions;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      if (!node.getTable().equals(tableName)) break;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      regions.add(node.getRegionInfo());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    return regions;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    return regionsMap.values();<a name="line.547"></a>
+<span class="sourceLineNo">519</span>  public void deleteRegions(final List&lt;RegionInfo&gt; regionInfos) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    regionInfos.forEach(this::deleteRegion);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (!node.getTable().equals(tableName)) break;<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      regions.add(node);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return regions;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (!node.getTable().equals(tableName)) break;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      regions.add(node.toRegionState());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return regions;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      if (!node.getTable().equals(tableName)) break;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      regions.add(node.getRegionInfo());<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return regions;<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      regions.add(node.toRegionState());<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return regions;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  RegionState helpers<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  // ==========================================================================<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        return node.toRegionState();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  // ============================================================================================<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  //  TODO: helpers<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  // ============================================================================================<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    // TODO<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  /**<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return getRegionsOfTable(table, false);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    synchronized (node) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      if (!include(node, false)) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      if (node.isInState(State.OPEN)) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          node.getOpenSeqNum());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      } else if (node.isInState(State.OPENING)) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      } else {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        return null;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Get the regions to be reopened when modifying a table.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * &lt;p/&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<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>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p/&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * &lt;p/&gt;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * &lt;ul&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;/ul&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @param oldLoc the previous state/location of this region<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   *         means we still need to reopen the region.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    synchronized (node) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        // in OPEN state before<a name="line.644"></a>
-<span class="sourceLineNo">645</span>        if (node.isInState(State.OPEN)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>            // normal case, the region has been reopened<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            return null;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          } else {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            // the open seq num does not change, need to reopen again<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              node.getOpenSeqNum());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        } else {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          // finished maybe, but not a problem).<a name="line.656"></a>
-<span class="sourceLineNo">657</span>          return null;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      } else {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        // in OPENING state before<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          // reopened(not finished maybe, but not a problem)<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          return null;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        } else {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>          }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          // is changed to OPEN.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   */<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   *         {@link State#SPLIT} state.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      .collect(Collectors.toList());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * weed out split and offline regions.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   */<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (LOG.isTraceEnabled()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Returns the set of regions hosted by the specified server<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * @param serverName the server we are interested in<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * @return set of RegionInfo hosted by the specified server<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    synchronized (serverInfo) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return serverInfo.getRegionInfoList();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  // ============================================================================================<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  // Split helpers<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  // the ServerStateNode by calling removeServer.<a name="line.730"></a>
+<span class="sourceLineNo">550</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return regionsMap.values();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      regions.add(node.toRegionState());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return regions;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>  // ==========================================================================<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  //  RegionState helpers<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  // ==========================================================================<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        return node.toRegionState();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    return null;<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>  //  TODO: helpers<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  // ============================================================================================<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // TODO<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return getRegionsOfTable(table, false);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    synchronized (node) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      if (!include(node, false)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        return null;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      if (node.isInState(State.OPEN)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          node.getOpenSeqNum());<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      } else if (node.isInState(State.OPENING)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        return null;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Get the regions to be reopened when modifying a table.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * &lt;p/&gt;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * &lt;p/&gt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * &lt;p/&gt;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;ul&gt;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param oldLoc the previous state/location of this region<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   *         means we still need to reopen the region.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    synchronized (node) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // in OPEN state before<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        if (node.isInState(State.OPEN)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>            // normal case, the region has been reopened<a name="line.651"></a>
+<span class="sourceLineNo">652</span>            return null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>          } else {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            // the open seq num does not change, need to reopen again<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.655"></a>
+<span class="sourceLineNo">656</span>              node.getOpenSeqNum());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        } else {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // finished maybe, but not a problem).<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          return null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      } else {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        // in OPENING state before<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          // reopened(not finished maybe, but not a problem)<a name="line.667"></a>
+<span class="sourceLineNo">668</span>          return null;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        } else {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>            return null;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          // is changed to OPEN.<a name="line.675"></a>
+<span class="sourceLineNo">676</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        }<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      }<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   */<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *         {@link State#SPLIT} state.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   */<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      .collect(Collectors.toList());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<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>   * Utility. Whether to include region in list of regions. Default is to<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * weed out split and offline regions.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   */<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    if (LOG.isTraceEnabled()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.713"></a>
+<span class="sourceLineNo">714</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<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>   * Returns the set of regions hosted by the specified server<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param serverName the server we are interested in<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return set of RegionInfo hosted by the specified server<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>    synchronized (serverInfo) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      return serverInfo.getRegionInfoList();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
 <span class="sourceLineNo">731</span>  // ============================================================================================<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    synchronized (serverNode) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      serverNode.setState(state);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @see #metaLogSplit(ServerName)<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    setServerState(serverName, ServerState.SPLITTING_META);<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>  /**<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * @see #metaLogSplitting(ServerName)<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public void metaLogSplit(ServerName serverName) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   * Call this when we start log splitting for a crashed Server.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @see #logSplit(ServerName)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  public void logSplitting(final ServerName serverName) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    setServerState(serverName, ServerState.SPLITTING);<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>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Called after we've split all logs on a crashed Server.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * @see #logSplitting(ServerName)<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  public void logSplit(final ServerName serverName) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    synchronized (regionNode) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      regionNode.setState(state);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  // ============================================================================================<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  //  TODO:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  // ============================================================================================<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      if (!node.isInTransition()) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        result.add(node.getRegionInfo());<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    return result;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (region != null) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      synchronized (region) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        return region.isInState(state);<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>    return false;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    for (RegionInfo hri: regions) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      if (node == null) continue;<a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>      // TODO: State.OPEN<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      final ServerName serverName = node.getRegionLocation();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (serverName == null) continue;<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      if (serverRegions == null) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        result.put(serverName, serverRegions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      serverRegions.add(node.getRegionInfo());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    }<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return result;<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>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return assignments;<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>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    final State[] states = State.values();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<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>    for (RegionStateNode node: regionsMap.values()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      if (node.getTable().equals(tableName)) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    return tableRegions;<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>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (region != null) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      synchronized (region) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        ServerName server = region.getRegionLocation();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        return server != null ? server : region.getLastHost();<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>    return null;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Can't let out original since it can change and at least the load balancer<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return A clone of current assignments by table.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      final boolean forceByCluster) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<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>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt;(1);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return result;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      if (tableResult == null) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        tableResult = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        result.put(node.getTable(), tableResult);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      final ServerName serverName = node.getRegionLocation();<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      if (serverName == null) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.info("Skipping, no server for " + node);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        continue;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      List&lt;RegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      if (serverResult == null) {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        serverResult = new ArrayList&lt;RegionInfo&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        tableResult.put(serverName, serverResult);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      serverResult.add(node.getRegionInfo());<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add online servers with no assignment for the table.<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; table: result.values()) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        for (ServerName svr : serverMap.keySet()) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          if (!table.containsKey(svr)) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>            table.put(svr, new ArrayList&lt;RegionInfo&gt;());<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          }<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>    return result;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  // ==========================================================================<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  //  Region in transition helpers<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  // ==========================================================================<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      final RegionTransitionProcedure procedure) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return true;<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>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      final RegionTransitionProcedure procedure) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    regionNode.unsetProcedure(procedure);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>  public boolean hasRegionsInTransition() {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    return !regionInTransition.isEmpty();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>  public boolean isRegionInTransition(final RegionInfo regionInfo) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return node != null ? node.isInTransition() : false;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   */<a name="line.957"></a>
-<span class="sourceLineNo">958</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final RegionInfo hri) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (node == null) return null;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    return node.getProcedure();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
-<span class="sourceLineNo">963</span><a name="line.963"></a>
-<span class="sourceLineNo">964</span>  public RegionState getRegionTransitionState(final RegionInfo hri) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    if (node == null) return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>    synchronized (node) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      return node.isInTransition() ? node.toRegionState() : null;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>  /**<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * Get the number of regions in transition.<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  public int getRegionsInTransitionCount() {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    return regionInTransition.size();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>  }<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      rit.add(node.toRegionState());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    return rit;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      rit.add(node.toRegionState());<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return rit;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  //  Region offline helpers<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  // TODO: Unused.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public void removeFromOfflineRegions(final RegionInfo regionInfo) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    regionOffline.remove(regionInfo);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span><a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>  // ==========================================================================<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  //  Region FAIL_OPEN helpers<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  // ==========================================================================<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  public static final class RegionFailedOpen {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private final RegionStateNode regionNode;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    private volatile Exception exception = null;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    private AtomicInteger retries = new AtomicInteger();<a name="line.1021"></a>
+<span class="sourceLineNo">732</span>  // Split helpers<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  // the ServerStateNode by calling removeServer.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>  // ============================================================================================<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    synchronized (serverNode) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      serverNode.setState(state);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @see #metaLogSplit(ServerName)<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   */<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    setServerState(serverName, ServerState.SPLITTING_META);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @see #metaLogSplitting(ServerName)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public void metaLogSplit(ServerName serverName) {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * Call this when we start log splitting for a crashed Server.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @see #logSplit(ServerName)<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public void logSplitting(final ServerName serverName) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    setServerState(serverName, ServerState.SPLITTING);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  /**<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * Called after we've split all logs on a crashed Server.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * @see #logSplitting(ServerName)<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  public void logSplit(final ServerName serverName) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    synchronized (regionNode) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      regionNode.setState(state);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    }<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>  // ============================================================================================<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  //  TODO:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  // ============================================================================================<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      if (!node.isInTransition()) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        result.add(node.getRegionInfo());<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    return result;<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    if (region != null) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      synchronized (region) {<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        return region.isInState(state);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return false;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return isRegionInState(regionInfo, State.OPEN);<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionInfo hri: regions) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (node == null) continue;<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      // TODO: State.OPEN<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      final ServerName serverName = node.getRegionLocation();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      if (serverName == null) continue;<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (serverRegions == null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        result.put(serverName, serverRegions);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      serverRegions.add(node.getRegionInfo());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    return result;<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    return assignments;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    final State[] states = State.values();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      if (node.getTable().equals(tableName)) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<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>    return tableRegions;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    if (region != null) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      synchronized (region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        ServerName server = region.getRegionLocation();<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        return server != null ? server : region.getLastHost();<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      }<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    return null;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * Can't let out original since it can change and at least the load balancer<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * @return A clone of current assignments by table.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      final boolean forceByCluster) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    final Map&lt;TableName, Map&lt;ServerNam

<TRUNCATED>

[09/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sourceLineNo">

<TRUNCATED>

[30/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
index d4bf03c..c372545 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
@@ -574,7 +574,7 @@
 <span class="sourceLineNo">566</span>     * and rack have the highest locality for region<a name="line.566"></a>
 <span class="sourceLineNo">567</span>     */<a name="line.567"></a>
 <span class="sourceLineNo">568</span>    private void computeCachedLocalities() {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numServers];<a name="line.569"></a>
+<span class="sourceLineNo">569</span>      rackLocalities = new float[numRegions][numRacks];<a name="line.569"></a>
 <span class="sourceLineNo">570</span>      regionsToMostLocalEntities = new int[LocalityType.values().length][numRegions];<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
 <span class="sourceLineNo">572</span>      // Compute localities and find most local server per region<a name="line.572"></a>


[14/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a 

<TRUNCATED>

[21/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class=

<TRUNCATED>

[20/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>        previo

<TRUNCATED>

[23/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a 

<TRUNCATED>

[17/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class=

<TRUNCATED>

[51/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

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


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

Branch: refs/heads/asf-site
Commit: df8fd1d3184376cae6648bfecdf3d5725a8ff0b1
Parents: 972a3c8
Author: jenkins <bu...@apache.org>
Authored: Sun Jul 22 09:30:13 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Sun Jul 22 09:30:13 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 apidocs/org/apache/hadoop/hbase/ServerName.html |    66 +-
 .../org/apache/hadoop/hbase/ServerName.html     |   747 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 32944 +++++++++--------
 checkstyle.rss                                  |     4 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |     6 +-
 devapidocs/index-all.html                       |    20 +-
 .../org/apache/hadoop/hbase/ServerName.html     |   126 +-
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../hadoop/hbase/class-use/ServerName.html      |     8 +-
 .../hbase/class-use/TableDescriptors.html       |    11 +
 .../client/class-use/ClusterConnection.html     |     5 +-
 .../hbase/client/class-use/RegionInfo.html      |    86 +-
 .../hadoop/hbase/client/package-tree.html       |    26 +-
 .../hadoop/hbase/coprocessor/package-tree.html  |     2 +-
 .../hbase/favored/FavoredNodesManager.html      |    41 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     2 +-
 .../RegionStates.RegionFailedOpen.html          |    22 +-
 .../hbase/master/assignment/RegionStates.html   |   229 +-
 ...asticLoadBalancer.CPRequestCostFunction.html |    10 +-
 ...ochasticLoadBalancer.CandidateGenerator.html |    22 +-
 ...lancer.CostFromRegionLoadAsRateFunction.html |     6 +-
 ...LoadBalancer.CostFromRegionLoadFunction.html |    20 +-
 .../StochasticLoadBalancer.CostFunction.html    |    28 +-
 ...sticLoadBalancer.LoadCandidateGenerator.html |    10 +-
 ...alancer.LocalityBasedCandidateGenerator.html |    14 +-
 ...cLoadBalancer.LocalityBasedCostFunction.html |    26 +-
 ...icLoadBalancer.MemStoreSizeCostFunction.html |    10 +-
 ...StochasticLoadBalancer.MoveCostFunction.html |    18 +-
 ...ncer.PrimaryRegionCountSkewCostFunction.html |    12 +-
 ...icLoadBalancer.RackLocalityCostFunction.html |    10 +-
 ...icLoadBalancer.RandomCandidateGenerator.html |     6 +-
 ...ticLoadBalancer.ReadRequestCostFunction.html |    10 +-
 ...oadBalancer.RegionCountSkewCostFunction.html |    12 +-
 ...alancer.RegionReplicaCandidateGenerator.html |    10 +-
 ...dBalancer.RegionReplicaHostCostFunction.html |    26 +-
 ...cer.RegionReplicaRackCandidateGenerator.html |     6 +-
 ...dBalancer.RegionReplicaRackCostFunction.html |    12 +-
 ...LoadBalancer.ServerLocalityCostFunction.html |    10 +-
 ...asticLoadBalancer.StoreFileCostFunction.html |    10 +-
 ...asticLoadBalancer.TableSkewCostFunction.html |    10 +-
 ...icLoadBalancer.WriteRequestCostFunction.html |    10 +-
 .../master/balancer/StochasticLoadBalancer.html |    10 +-
 .../hadoop/hbase/master/package-tree.html       |     6 +-
 .../procedure/RestoreSnapshotProcedure.html     |   154 +-
 .../procedure/class-use/MasterProcedureEnv.html |    70 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    18 +-
 .../hadoop/hbase/procedure2/ProcedureDeque.html |     2 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     6 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../hadoop/hbase/regionserver/package-tree.html |    16 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 ...icationEndpoint.RegionReplicaOutputSink.html |    26 +-
 ...ionEndpoint.RegionReplicaReplayCallable.html |    12 +-
 ...icationEndpoint.RegionReplicaSinkWriter.html |    45 +-
 ...ReplicationEndpoint.RetryingRpcCallable.html |    12 +-
 .../RegionReplicaReplicationEndpoint.html       |    40 +-
 ...icationEndpoint.RegionReplicaOutputSink.html |     5 +-
 .../hbase/security/access/package-tree.html     |     4 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 ...estoreSnapshotHelper.RestoreMetaChanges.html |    38 +-
 .../hbase/snapshot/RestoreSnapshotHelper.html   |    38 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     6 +-
 .../org/apache/hadoop/hbase/ServerName.html     |   747 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../hbase/favored/FavoredNodesManager.html      |    78 +-
 .../RegionStates.AssignmentProcedureEvent.html  |  1253 +-
 .../RegionStates.RegionFailedOpen.html          |  1253 +-
 .../RegionStates.RegionStateNode.html           |  1253 +-
 ...RegionStates.RegionStateStampComparator.html |  1253 +-
 .../RegionStates.ServerReportEvent.html         |  1253 +-
 .../assignment/RegionStates.ServerState.html    |  1253 +-
 .../RegionStates.ServerStateNode.html           |  1253 +-
 .../hbase/master/assignment/RegionStates.html   |  1253 +-
 .../BaseLoadBalancer.Cluster.Action.Type.html   |     2 +-
 .../BaseLoadBalancer.Cluster.Action.html        |     2 +-
 ...LoadBalancer.Cluster.AssignRegionAction.html |     2 +-
 .../BaseLoadBalancer.Cluster.LocalityType.html  |     2 +-
 ...seLoadBalancer.Cluster.MoveRegionAction.html |     2 +-
 ...eLoadBalancer.Cluster.SwapRegionsAction.html |     2 +-
 .../balancer/BaseLoadBalancer.Cluster.html      |     2 +-
 .../BaseLoadBalancer.DefaultRackManager.html    |     2 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |     2 +-
 ...asticLoadBalancer.CPRequestCostFunction.html |  2397 +-
 ...ochasticLoadBalancer.CandidateGenerator.html |  2397 +-
 ...lancer.CostFromRegionLoadAsRateFunction.html |  2397 +-
 ...LoadBalancer.CostFromRegionLoadFunction.html |  2397 +-
 .../StochasticLoadBalancer.CostFunction.html    |  2397 +-
 ...sticLoadBalancer.LoadCandidateGenerator.html |  2397 +-
 ...alancer.LocalityBasedCandidateGenerator.html |  2397 +-
 ...cLoadBalancer.LocalityBasedCostFunction.html |  2397 +-
 ...icLoadBalancer.MemStoreSizeCostFunction.html |  2397 +-
 ...StochasticLoadBalancer.MoveCostFunction.html |  2397 +-
 ...ncer.PrimaryRegionCountSkewCostFunction.html |  2397 +-
 ...icLoadBalancer.RackLocalityCostFunction.html |  2397 +-
 ...icLoadBalancer.RandomCandidateGenerator.html |  2397 +-
 ...ticLoadBalancer.ReadRequestCostFunction.html |  2397 +-
 ...oadBalancer.RegionCountSkewCostFunction.html |  2397 +-
 ...alancer.RegionReplicaCandidateGenerator.html |  2397 +-
 ...dBalancer.RegionReplicaHostCostFunction.html |  2397 +-
 ...cer.RegionReplicaRackCandidateGenerator.html |  2397 +-
 ...dBalancer.RegionReplicaRackCostFunction.html |  2397 +-
 ...LoadBalancer.ServerLocalityCostFunction.html |  2397 +-
 ...asticLoadBalancer.StoreFileCostFunction.html |  2397 +-
 ...asticLoadBalancer.TableSkewCostFunction.html |  2397 +-
 ...icLoadBalancer.WriteRequestCostFunction.html |  2397 +-
 .../master/balancer/StochasticLoadBalancer.html |  2397 +-
 .../procedure/RestoreSnapshotProcedure.html     |   981 +-
 .../hadoop/hbase/procedure2/ProcedureDeque.html |     6 +-
 ...icationEndpoint.RegionReplicaOutputSink.html |  1184 +-
 ...ionEndpoint.RegionReplicaReplayCallable.html |  1184 +-
 ...icationEndpoint.RegionReplicaSinkWriter.html |  1184 +-
 ...ReplicationEndpoint.RetryingRpcCallable.html |  1184 +-
 .../RegionReplicaReplicationEndpoint.html       |  1184 +-
 ...estoreSnapshotHelper.RestoreMetaChanges.html |  1291 +-
 .../hbase/snapshot/RestoreSnapshotHelper.html   |  1291 +-
 downloads.html                                  |    18 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 .../hadoop/hbase/HBaseTestingUtility.html       |   175 +-
 .../hadoop/hbase/HBaseTestingUtility.html       |  3426 +-
 testdevapidocs/index-all.html                   |    16 +-
 ...lity.PortAllocator.AvailablePortChecker.html |     4 +-
 .../HBaseTestingUtility.PortAllocator.html      |    20 +-
 .../hadoop/hbase/HBaseTestingUtility.html       |   406 +-
 .../org/apache/hadoop/hbase/TestServerName.html |    56 +-
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../TestMobRestoreSnapshotFromClient.html       |     2 +-
 .../client/TestRestoreSnapshotFromClient.html   |    90 +-
 ...oreSnapshotFromClientWithRegionReplicas.html |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |     8 +-
 .../hadoop/hbase/procedure/package-tree.html    |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hadoop/hbase/regionserver/package-tree.html |     6 +-
 .../TestRegionReplicaReplicationEndpoint.html   |    90 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 ...lity.PortAllocator.AvailablePortChecker.html |  3426 +-
 .../HBaseTestingUtility.PortAllocator.html      |  3426 +-
 .../HBaseTestingUtility.SeenRowTracker.html     |  3426 +-
 .../hadoop/hbase/HBaseTestingUtility.html       |  3426 +-
 .../org/apache/hadoop/hbase/TestServerName.html |   244 +-
 .../client/TestRestoreSnapshotFromClient.html   |   671 +-
 .../TestRegionReplicaReplicationEndpoint.html   |   847 +-
 176 files changed, 66807 insertions(+), 66197 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 78af3cf..09dd7d7 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180720" />
+    <meta name="Date-Revision-yyyymmdd" content="20180722" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -601,7 +601,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 8cdf880..9dd9062 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180720142958+00'00')
-/CreationDate (D:20180720144607+00'00')
+/ModDate (D:20180722091024+00'00')
+/CreationDate (D:20180722092647+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/apidocs/org/apache/hadoop/hbase/ServerName.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/ServerName.html b/apidocs/org/apache/hadoop/hbase/ServerName.html
index 82a2c34..31d943d 100644
--- a/apidocs/org/apache/hadoop/hbase/ServerName.html
+++ b/apidocs/org/apache/hadoop/hbase/ServerName.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.58">ServerName</a>
+public class <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.60">ServerName</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;, <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a></pre>
 <div class="block">Name of a particular incarnation of an HBase Server.
@@ -396,7 +396,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>NON_STARTCODE</h4>
-<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.73">NON_STARTCODE</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.75">NON_STARTCODE</a></pre>
 <div class="block">What to use if no startcode supplied.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -410,7 +410,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>SERVERNAME_SEPARATOR</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.79">SERVERNAME_SEPARATOR</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.81">SERVERNAME_SEPARATOR</a></pre>
 <div class="block">This character is used as separator between server hostname, port and
  startcode.</div>
 <dl>
@@ -425,7 +425,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>SERVERNAME_PATTERN</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html?is-external=true" title="class or interface in java.util.regex">Pattern</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.81">SERVERNAME_PATTERN</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html?is-external=true" title="class or interface in java.util.regex">Pattern</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.83">SERVERNAME_PATTERN</a></pre>
 </li>
 </ul>
 <a name="UNKNOWN_SERVERNAME">
@@ -434,7 +434,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>UNKNOWN_SERVERNAME</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.89">UNKNOWN_SERVERNAME</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.91">UNKNOWN_SERVERNAME</a></pre>
 <div class="block">What to use if server name is unknown.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -448,7 +448,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>EMPTY_SERVER_LIST</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.100">EMPTY_SERVER_LIST</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.102">EMPTY_SERVER_LIST</a></pre>
 </li>
 </ul>
 </li>
@@ -465,7 +465,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ServerName</h4>
-<pre>protected&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.102">ServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname,
+<pre>protected&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.111">ServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname,
                      int&nbsp;port,
                      long&nbsp;startcode)</pre>
 </li>
@@ -485,7 +485,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <li class="blockList">
 <h4>parseHostname</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.142">parseHostname</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.151">parseHostname</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>valueOf(String)</code></a></span></div>
 </li>
 </ul>
@@ -496,7 +496,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <li class="blockList">
 <h4>parsePort</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.158">parsePort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.167">parsePort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>valueOf(String)</code></a></span></div>
 </li>
 </ul>
@@ -507,7 +507,7 @@ public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbas
 <li class="blockList">
 <h4>parseStartcode</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.168">parseStartcode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.177">parseStartcode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>valueOf(String)</code></a></span></div>
 </li>
 </ul>
@@ -517,7 +517,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.178">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.187">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname,
                                  int&nbsp;port,
                                  long&nbsp;startcode)</pre>
 <div class="block">Retrieve an instance of ServerName.
@@ -531,7 +531,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.187">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.196">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block">Retrieve an instance of ServerName.
  Callers should use the equals method to compare returned instances, though we may return
  a shared immutable object as an internal optimization.</div>
@@ -543,7 +543,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.196">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.205">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
                                  long&nbsp;startCode)</pre>
 <div class="block">Retrieve an instance of ServerName.
  Callers should use the equals method to compare returned instances, though we may return
@@ -556,7 +556,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.201">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.210">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -569,7 +569,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>toShortString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.211">toShortString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.220">toShortString</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return a SHORT version of <a href="../../../../org/apache/hadoop/hbase/ServerName.html#toString--"><code>toString()</code></a>, one that has the host only,
@@ -585,7 +585,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getVersionedBytes</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.221">getVersionedBytes</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.230">getVersionedBytes</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd><a href="../../../../org/apache/hadoop/hbase/ServerName.html#getServerName--"><code>getServerName()</code></a> as bytes with a short-sized prefix with
@@ -599,7 +599,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.228">getServerName</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.237">getServerName</a>()</pre>
 </li>
 </ul>
 <a name="getHostname--">
@@ -608,7 +608,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getHostname</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.232">getHostname</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.241">getHostname</a>()</pre>
 </li>
 </ul>
 <a name="getHostnameLowerCase--">
@@ -617,7 +617,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getHostnameLowerCase</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.236">getHostnameLowerCase</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.245">getHostnameLowerCase</a>()</pre>
 </li>
 </ul>
 <a name="getPort--">
@@ -626,7 +626,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getPort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.240">getPort</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.249">getPort</a>()</pre>
 </li>
 </ul>
 <a name="getStartcode--">
@@ -635,7 +635,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartcode</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.244">getStartcode</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.253">getStartcode</a>()</pre>
 </li>
 </ul>
 <a name="getServerName-java.lang.String-long-">
@@ -645,7 +645,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <li class="blockList">
 <h4>getServerName</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.277">getServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
+public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.286">getServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
                                                long&nbsp;startcode)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-long-"><code>valueOf(String, long)</code></a> instead.</span></div>
 <dl>
@@ -665,7 +665,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <li class="blockList">
 <h4>getHostAndPort</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.291">getHostAndPort</a>()</pre>
+public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.300">getHostAndPort</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#getAddress--"><code>getAddress()</code></a> instead.</span></div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -680,7 +680,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getAddress</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.295">getAddress</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.304">getAddress</a>()</pre>
 </li>
 </ul>
 <a name="getServerStartcodeFromServerName-java.lang.String-">
@@ -690,7 +690,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <li class="blockList">
 <h4>getServerStartcodeFromServerName</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.305">getServerStartcodeFromServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.314">getServerStartcodeFromServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use instance of ServerName to pull out start code.</span></div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -707,7 +707,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <li class="blockList">
 <h4>getServerNameLessStartCode</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.317">getServerNameLessStartCode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;inServerName)</pre>
+public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.326">getServerNameLessStartCode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;inServerName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#getAddress--"><code>getAddress()</code></a></span></div>
 <div class="block">Utility method to excise the start code from a server name</div>
 <dl>
@@ -724,7 +724,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.328">compareTo</a>(<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;other)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.337">compareTo</a>(<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;other)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></dd>
@@ -737,7 +737,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.354">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.363">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -750,7 +750,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.359">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.368">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -763,7 +763,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>isSameAddress</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.371">isSameAddress</a>(<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;left,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.380">isSameAddress</a>(<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;left,
                                     <a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;right)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -780,7 +780,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>parseVersionedServerName</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.388">parseVersionedServerName</a>(byte[]&nbsp;versionedBytes)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.397">parseVersionedServerName</a>(byte[]&nbsp;versionedBytes)</pre>
 <div class="block">Use this method instantiating a <a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase"><code>ServerName</code></a> from bytes
  gotten from a call to <a href="../../../../org/apache/hadoop/hbase/ServerName.html#getVersionedBytes--"><code>getVersionedBytes()</code></a>.  Will take care of the
  case where bytes were written by an earlier version of hbase.</div>
@@ -800,7 +800,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>parseServerName</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.405">parseServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;str)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.414">parseServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;str)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>str</code> - Either an instance of <a href="../../../../org/apache/hadoop/hbase/ServerName.html#toString--"><code>toString()</code></a> or a
@@ -816,7 +816,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isFullServerName</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.415">isFullServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;str)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.424">isFullServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;str)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if the String follows the pattern of <a href="../../../../org/apache/hadoop/hbase/ServerName.html#toString--"><code>toString()</code></a>, false


[16/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sour

<TRUNCATED>

[38/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html
index 5f41fe7..c8158b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.AssignmentProcedureEvent.html
@@ -524,636 +524,639 @@
 <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><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      if (!node.getTable().equals(tableName)) break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      regions.add(node);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return regions;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      if (!node.getTable().equals(tableName)) break;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      regions.add(node.toRegionState());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return regions;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      if (!node.getTable().equals(tableName)) break;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      regions.add(node.getRegionInfo());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    return regions;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    return regionsMap.values();<a name="line.547"></a>
+<span class="sourceLineNo">519</span>  public void deleteRegions(final List&lt;RegionInfo&gt; regionInfos) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    regionInfos.forEach(this::deleteRegion);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (!node.getTable().equals(tableName)) break;<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      regions.add(node);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return regions;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (!node.getTable().equals(tableName)) break;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      regions.add(node.toRegionState());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return regions;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      if (!node.getTable().equals(tableName)) break;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      regions.add(node.getRegionInfo());<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return regions;<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      regions.add(node.toRegionState());<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return regions;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  RegionState helpers<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  // ==========================================================================<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        return node.toRegionState();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  // ============================================================================================<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  //  TODO: helpers<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  // ============================================================================================<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    // TODO<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  /**<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return getRegionsOfTable(table, false);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    synchronized (node) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      if (!include(node, false)) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      if (node.isInState(State.OPEN)) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          node.getOpenSeqNum());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      } else if (node.isInState(State.OPENING)) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      } else {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        return null;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Get the regions to be reopened when modifying a table.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * &lt;p/&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<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>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p/&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * &lt;p/&gt;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * &lt;ul&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;/ul&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @param oldLoc the previous state/location of this region<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   *         means we still need to reopen the region.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    synchronized (node) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        // in OPEN state before<a name="line.644"></a>
-<span class="sourceLineNo">645</span>        if (node.isInState(State.OPEN)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>            // normal case, the region has been reopened<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            return null;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          } else {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            // the open seq num does not change, need to reopen again<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              node.getOpenSeqNum());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        } else {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          // finished maybe, but not a problem).<a name="line.656"></a>
-<span class="sourceLineNo">657</span>          return null;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      } else {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        // in OPENING state before<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          // reopened(not finished maybe, but not a problem)<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          return null;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        } else {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>          }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          // is changed to OPEN.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   */<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   *         {@link State#SPLIT} state.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      .collect(Collectors.toList());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * weed out split and offline regions.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   */<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (LOG.isTraceEnabled()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Returns the set of regions hosted by the specified server<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * @param serverName the server we are interested in<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * @return set of RegionInfo hosted by the specified server<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    synchronized (serverInfo) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return serverInfo.getRegionInfoList();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  // ============================================================================================<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  // Split helpers<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  // the ServerStateNode by calling removeServer.<a name="line.730"></a>
+<span class="sourceLineNo">550</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return regionsMap.values();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      regions.add(node.toRegionState());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return regions;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>  // ==========================================================================<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  //  RegionState helpers<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  // ==========================================================================<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        return node.toRegionState();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    return null;<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>  //  TODO: helpers<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  // ============================================================================================<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // TODO<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return getRegionsOfTable(table, false);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    synchronized (node) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      if (!include(node, false)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        return null;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      if (node.isInState(State.OPEN)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          node.getOpenSeqNum());<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      } else if (node.isInState(State.OPENING)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        return null;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Get the regions to be reopened when modifying a table.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * &lt;p/&gt;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * &lt;p/&gt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * &lt;p/&gt;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;ul&gt;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param oldLoc the previous state/location of this region<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   *         means we still need to reopen the region.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    synchronized (node) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // in OPEN state before<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        if (node.isInState(State.OPEN)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>            // normal case, the region has been reopened<a name="line.651"></a>
+<span class="sourceLineNo">652</span>            return null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>          } else {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            // the open seq num does not change, need to reopen again<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.655"></a>
+<span class="sourceLineNo">656</span>              node.getOpenSeqNum());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        } else {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // finished maybe, but not a problem).<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          return null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      } else {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        // in OPENING state before<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          // reopened(not finished maybe, but not a problem)<a name="line.667"></a>
+<span class="sourceLineNo">668</span>          return null;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        } else {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>            return null;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          // is changed to OPEN.<a name="line.675"></a>
+<span class="sourceLineNo">676</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        }<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      }<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   */<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *         {@link State#SPLIT} state.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   */<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      .collect(Collectors.toList());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<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>   * Utility. Whether to include region in list of regions. Default is to<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * weed out split and offline regions.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   */<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    if (LOG.isTraceEnabled()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.713"></a>
+<span class="sourceLineNo">714</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<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>   * Returns the set of regions hosted by the specified server<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param serverName the server we are interested in<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return set of RegionInfo hosted by the specified server<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>    synchronized (serverInfo) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      return serverInfo.getRegionInfoList();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
 <span class="sourceLineNo">731</span>  // ============================================================================================<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    synchronized (serverNode) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      serverNode.setState(state);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @see #metaLogSplit(ServerName)<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    setServerState(serverName, ServerState.SPLITTING_META);<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>  /**<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * @see #metaLogSplitting(ServerName)<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public void metaLogSplit(ServerName serverName) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   * Call this when we start log splitting for a crashed Server.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @see #logSplit(ServerName)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  public void logSplitting(final ServerName serverName) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    setServerState(serverName, ServerState.SPLITTING);<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>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Called after we've split all logs on a crashed Server.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * @see #logSplitting(ServerName)<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  public void logSplit(final ServerName serverName) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    synchronized (regionNode) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      regionNode.setState(state);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  // ============================================================================================<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  //  TODO:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  // ============================================================================================<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      if (!node.isInTransition()) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        result.add(node.getRegionInfo());<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    return result;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (region != null) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      synchronized (region) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        return region.isInState(state);<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>    return false;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    for (RegionInfo hri: regions) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      if (node == null) continue;<a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>      // TODO: State.OPEN<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      final ServerName serverName = node.getRegionLocation();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (serverName == null) continue;<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      if (serverRegions == null) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        result.put(serverName, serverRegions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      serverRegions.add(node.getRegionInfo());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    }<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return result;<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>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return assignments;<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>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    final State[] states = State.values();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<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>    for (RegionStateNode node: regionsMap.values()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      if (node.getTable().equals(tableName)) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    return tableRegions;<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>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (region != null) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      synchronized (region) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        ServerName server = region.getRegionLocation();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        return server != null ? server : region.getLastHost();<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>    return null;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Can't let out original since it can change and at least the load balancer<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return A clone of current assignments by table.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      final boolean forceByCluster) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<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>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt;(1);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return result;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      if (tableResult == null) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        tableResult = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        result.put(node.getTable(), tableResult);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      final ServerName serverName = node.getRegionLocation();<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      if (serverName == null) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.info("Skipping, no server for " + node);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        continue;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      List&lt;RegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      if (serverResult == null) {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        serverResult = new ArrayList&lt;RegionInfo&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        tableResult.put(serverName, serverResult);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      serverResult.add(node.getRegionInfo());<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add online servers with no assignment for the table.<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; table: result.values()) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        for (ServerName svr : serverMap.keySet()) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          if (!table.containsKey(svr)) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>            table.put(svr, new ArrayList&lt;RegionInfo&gt;());<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          }<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>    return result;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  // ==========================================================================<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  //  Region in transition helpers<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  // ==========================================================================<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      final RegionTransitionProcedure procedure) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return true;<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>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      final RegionTransitionProcedure procedure) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    regionNode.unsetProcedure(procedure);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>  public boolean hasRegionsInTransition() {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    return !regionInTransition.isEmpty();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>  public boolean isRegionInTransition(final RegionInfo regionInfo) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return node != null ? node.isInTransition() : false;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   */<a name="line.957"></a>
-<span class="sourceLineNo">958</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final RegionInfo hri) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (node == null) return null;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    return node.getProcedure();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
-<span class="sourceLineNo">963</span><a name="line.963"></a>
-<span class="sourceLineNo">964</span>  public RegionState getRegionTransitionState(final RegionInfo hri) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    if (node == null) return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>    synchronized (node) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      return node.isInTransition() ? node.toRegionState() : null;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>  /**<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * Get the number of regions in transition.<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  public int getRegionsInTransitionCount() {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    return regionInTransition.size();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>  }<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      rit.add(node.toRegionState());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    return rit;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      rit.add(node.toRegionState());<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return rit;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  //  Region offline helpers<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  // TODO: Unused.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public void removeFromOfflineRegions(final RegionInfo regionInfo) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    regionOffline.remove(regionInfo);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span><a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>  // ==========================================================================<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  //  Region FAIL_OPEN helpers<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  // ==========================================================================<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  public static final class RegionFailedOpen {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private final RegionStateNode regionNode;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    private volatile Exception exception = null;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    private AtomicInteger retries = new AtomicInteger();<a name="line.1021"></a>
+<span class="sourceLineNo">732</span>  // Split helpers<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  // the ServerStateNode by calling removeServer.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>  // ============================================================================================<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    synchronized (serverNode) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      serverNode.setState(state);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @see #metaLogSplit(ServerName)<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   */<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    setServerState(serverName, ServerState.SPLITTING_META);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @see #metaLogSplitting(ServerName)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public void metaLogSplit(ServerName serverName) {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * Call this when we start log splitting for a crashed Server.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @see #logSplit(ServerName)<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public void logSplitting(final ServerName serverName) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    setServerState(serverName, ServerState.SPLITTING);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  /**<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * Called after we've split all logs on a crashed Server.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * @see #logSplitting(ServerName)<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  public void logSplit(final ServerName serverName) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    synchronized (regionNode) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      regionNode.setState(state);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    }<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>  // ============================================================================================<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  //  TODO:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  // ============================================================================================<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      if (!node.isInTransition()) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        result.add(node.getRegionInfo());<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    return result;<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    if (region != null) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      synchronized (region) {<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        return region.isInState(state);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return false;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return isRegionInState(regionInfo, State.OPEN);<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionInfo hri: regions) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (node == null) continue;<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      // TODO: State.OPEN<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      final ServerName serverName = node.getRegionLocation();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      if (serverName == null) continue;<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (serverRegions == null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        result.put(serverName, serverRegions);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      serverRegions.add(node.getRegionInfo());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    return result;<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    return assignments;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    final State[] states = State.values();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      if (node.getTable().equals(tableName)) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<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>    return tableRegions;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    if (region != null) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      synchronized (region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        ServerName server = region.getRegionLocation();<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        return server != null ? server : region.getLastHost();<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      }<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    return null;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * Can't let out original since it can change and at least the load balancer<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * @return A clone of current assignments by table.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      final boolean forceByCluster) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.892"></a>
+<span class="sourceLineNo">893</span

<TRUNCATED>

[42/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html
index 012416e..9d1748f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -129,7 +129,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.60">RestoreSnapshotProcedure</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.64">RestoreSnapshotProcedure</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">AbstractStateMachineTableProcedure</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&gt;</pre>
 </li>
 </ul>
@@ -280,110 +280,126 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 </td>
 </tr>
 <tr id="i1" class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#addRegionsToInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">addRegionsToInMemoryStates</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos,
+                          <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                          int&nbsp;regionReplication)</code>
+<div class="block">Add regions to in-memory states</div>
+</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#deleteRegionsFromInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">deleteRegionsFromInMemoryStates</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos,
+                               <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                               int&nbsp;regionReplication)</code>
+<div class="block">Delete regions from in-memory states</div>
+</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">Called on store load to allow the user to decode the previously serialized
  state.</div>
 </td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#executeFromState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState-">executeFromState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                 org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)</code>
 <div class="block">called to perform a single step of the specified 'state' of the procedure</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#getInitialState--">getInitialState</a></span>()</code>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#getMonitorStatus--">getMonitorStatus</a></span>()</code>
 <div class="block">Set up monitor status if it is not created.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#getState-int-">getState</a></span>(int&nbsp;stateId)</code>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>protected int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#getStateId-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState-">getStateId</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)</code>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#getTableOperationType--">getTableOperationType</a></span>()</code>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#isRollbackSupported-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState-">isRollbackSupported</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)</code>
 <div class="block">Used by the default implementation of abort() to know if the current state can be aborted
  and rollback can be triggered.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#isTraceEnabled--">isTraceEnabled</a></span>()</code>
 <div class="block">The procedure could be restarted from a different machine.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#prepareRestore-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">prepareRestore</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Action before any real action of restoring from snapshot.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#restoreSnapshot-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">restoreSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Execute the on-disk Restore</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#restoreSnapshotAcl-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">restoreSnapshotAcl</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#rollbackState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState-">rollbackState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)</code>
 <div class="block">called to perform the rollback of the specified state</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)</code>
 <div class="block">The user-level code of the procedure may have some state to
  persist (e.g.</div>
 </td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#toStringClassDetails-java.lang.StringBuilder-">toStringClassDetails</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</code>
 <div class="block">Extend the toString() information with the procedure details
  e.g.</div>
 </td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#updateMETA-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateMETA</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Apply changes to hbase:meta</div>
 </td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#updateTableDescriptor-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">updateTableDescriptor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Update descriptor</div>
@@ -438,7 +454,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.62">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.66">LOG</a></pre>
 </li>
 </ul>
 <a name="modifiedTableDescriptor">
@@ -447,7 +463,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>modifiedTableDescriptor</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.64">modifiedTableDescriptor</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.68">modifiedTableDescriptor</a></pre>
 </li>
 </ul>
 <a name="regionsToRestore">
@@ -456,7 +472,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsToRestore</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.65">regionsToRestore</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.69">regionsToRestore</a></pre>
 </li>
 </ul>
 <a name="regionsToRemove">
@@ -465,7 +481,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsToRemove</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.66">regionsToRemove</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.70">regionsToRemove</a></pre>
 </li>
 </ul>
 <a name="regionsToAdd">
@@ -474,7 +490,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsToAdd</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.67">regionsToAdd</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.71">regionsToAdd</a></pre>
 </li>
 </ul>
 <a name="parentsToChildrenPairMap">
@@ -483,7 +499,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>parentsToChildrenPairMap</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.68">parentsToChildrenPairMap</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.72">parentsToChildrenPairMap</a></pre>
 </li>
 </ul>
 <a name="snapshot">
@@ -492,7 +508,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.70">snapshot</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.74">snapshot</a></pre>
 </li>
 </ul>
 <a name="restoreAcl">
@@ -501,7 +517,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreAcl</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.71">restoreAcl</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.75">restoreAcl</a></pre>
 </li>
 </ul>
 <a name="monitorStatus">
@@ -510,7 +526,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>monitorStatus</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.74">monitorStatus</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.78">monitorStatus</a></pre>
 </li>
 </ul>
 <a name="traceEnabled">
@@ -519,7 +535,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>traceEnabled</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.76">traceEnabled</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.80">traceEnabled</a></pre>
 </li>
 </ul>
 </li>
@@ -536,7 +552,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>RestoreSnapshotProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.81">RestoreSnapshotProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.85">RestoreSnapshotProcedure</a>()</pre>
 <div class="block">Constructor (for failover)</div>
 </li>
 </ul>
@@ -546,7 +562,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>RestoreSnapshotProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.84">RestoreSnapshotProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.88">RestoreSnapshotProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                 <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
                                 org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
                          throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
@@ -562,7 +578,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RestoreSnapshotProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.96">RestoreSnapshotProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.100">RestoreSnapshotProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                 <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
                                 org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                 boolean&nbsp;restoreAcl)
@@ -593,7 +609,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getMonitorStatus</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.117">getMonitorStatus</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.121">getMonitorStatus</a>()</pre>
 <div class="block">Set up monitor status if it is not created.</div>
 </li>
 </ul>
@@ -603,7 +619,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.126">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.130">executeFromState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                                       org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)
                                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#executeFromState-TEnvironment-TState-">StateMachineProcedure</a></code></span></div>
@@ -626,7 +642,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.172">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.176">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#rollbackState-TEnvironment-TState-">StateMachineProcedure</a></code></span></div>
@@ -646,7 +662,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>isRollbackSupported</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.184">isRollbackSupported</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.188">isRollbackSupported</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#isRollbackSupported-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">Used by the default implementation of abort() to know if the current state can be aborted
  and rollback can be triggered.</div>
@@ -662,7 +678,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.194">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.198">getState</a>(int&nbsp;stateId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getState-int-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 <dl>
@@ -681,7 +697,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.199">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.203">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;state)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getStateId-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 <dl>
@@ -700,7 +716,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.204">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.208">getInitialState</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getInitialState--">StateMachineProcedure</a></code></span></div>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 <dl>
@@ -717,7 +733,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.209">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.213">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface</a></code></dd>
@@ -734,7 +750,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.214">getTableOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.218">getTableOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableOperationType--">TableProcedureInterface</a></code></span></div>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.
  e.g. if we get a delete and we have some table operation pending (e.g. add column)
@@ -755,7 +771,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.219">abort</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.223">abort</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#abort-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">The abort() call is asynchronous and each procedure must decide how to deal
  with it, if they want to be abortable. The simplest implementation
@@ -778,7 +794,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringClassDetails</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.225">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.229">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringClassDetails-java.lang.StringBuilder-">Procedure</a></code></span></div>
 <div class="block">Extend the toString() information with the procedure details
  e.g. className and parameters</div>
@@ -796,7 +812,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.235">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.239">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -818,7 +834,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.278">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.282">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized
@@ -839,7 +855,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareRestore</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.330">prepareRestore</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.334">prepareRestore</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Action before any real action of restoring from snapshot.</div>
 <dl>
@@ -856,7 +872,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>updateTableDescriptor</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.370">updateTableDescriptor</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.374">updateTableDescriptor</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Update descriptor</div>
 <dl>
@@ -873,7 +889,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreSnapshot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.379">restoreSnapshot</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.383">restoreSnapshot</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Execute the on-disk Restore</div>
 <dl>
@@ -890,7 +906,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>updateMETA</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.419">updateMETA</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.423">updateMETA</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Apply changes to hbase:meta</div>
 <dl>
@@ -901,13 +917,49 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 </dl>
 </li>
 </ul>
+<a name="deleteRegionsFromInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>deleteRegionsFromInMemoryStates</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.492">deleteRegionsFromInMemoryStates</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos,
+                                             <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                                             int&nbsp;regionReplication)</pre>
+<div class="block">Delete regions from in-memory states</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>regionInfos</code> - regions to delete</dd>
+<dd><code>env</code> - MasterProcedureEnv</dd>
+<dd><code>regionReplication</code> - the number of region replications</dd>
+</dl>
+</li>
+</ul>
+<a name="addRegionsToInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>addRegionsToInMemoryStates</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.524">addRegionsToInMemoryStates</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos,
+                                        <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                                        int&nbsp;regionReplication)</pre>
+<div class="block">Add regions to in-memory states</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>regionInfos</code> - regions to add</dd>
+<dd><code>env</code> - MasterProcedureEnv</dd>
+<dd><code>regionReplication</code> - the number of region replications</dd>
+</dl>
+</li>
+</ul>
 <a name="restoreSnapshotAcl-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreSnapshotAcl</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.482">restoreSnapshotAcl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.543">restoreSnapshotAcl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -921,7 +973,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isTraceEnabled</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.497">isTraceEnabled</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#line.558">isTraceEnabled</a>()</pre>
 <div class="block">The procedure could be restarted from a different machine. If the variable is null, we need to
  retrieve it.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
index f98ae5c..7c6d484 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.html
@@ -993,11 +993,19 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">RestoreSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#addRegionsToInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">addRegionsToInMemoryStates</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos,
+                          <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                          int&nbsp;regionReplication)</code>
+<div class="block">Add regions to in-memory states</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">CloneSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.html#addRegionsToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">addRegionsToMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Add regions to hbase:meta table.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#addRegionsToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">addRegionsToMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                 <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
@@ -1005,48 +1013,48 @@
 <div class="block">Add the specified set of regions to the hbase:meta table.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">ModifyTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.html#addRegionsToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">addRegionsToMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                 <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#addTableToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">addTableToMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest</code></td>
 <td class="colLast"><span class="typeNameLabel">RSProcedureDispatcher.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html#buildOpenRegionRequest-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.ServerName-java.util.List-">buildOpenRegionRequest</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                       <a href="../../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.RegionOpenOperation.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher.RegionOpenOperation</a>&gt;&nbsp;operations)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo</code></td>
 <td class="colLast"><span class="typeNameLabel">RSProcedureDispatcher.RegionOpenOperation.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.RegionOpenOperation.html#buildRegionOpenInfoRequest-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">buildRegionOpenInfoRequest</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractStateMachineTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.html#checkOnline-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.RegionInfo-">checkOnline</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
            <a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;ri)</code>
 <div class="block">Check region is online.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractStateMachineRegionProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineRegionProcedure.html#checkTableModifiable-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">checkTableModifiable</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Check whether a table is modifiable - exists and either offline or online with config set</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractStateMachineTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.html#checkTableModifiable-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">checkTableModifiable</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block">Check whether a table is modifiable - exists and either offline or online with config set</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.html#cleanAnyRemainingRows-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-">cleanAnyRemainingRows</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                      <a href="../../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
@@ -1054,32 +1062,32 @@
  info:regioninfo column was empty because of some write error.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">RecoverMetaProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#completionCleanup-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">completionCleanup</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 &nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">TruncateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html#completionCleanup-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">completionCleanup</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">ModifyTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.html#completionCleanup-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">completionCleanup</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">InitMetaProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/InitMetaProcedure.html#completionCleanup-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">completionCleanup</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.html#createDirectory-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.NamespaceDescriptor-">createDirectory</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                <a href="../../../../../../../org/apache/hadoop/hbase/NamespaceDescriptor.html" title="class in org.apache.hadoop.hbase">NamespaceDescriptor</a>&nbsp;nsDescriptor)</code>
 <div class="block">Create the namespace directory</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CloneSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.html#createFilesystemLayout-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">createFilesystemLayout</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                       <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
@@ -1087,20 +1095,20 @@
 <div class="block">Create regions in file system.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#createFsLayout-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">createFsLayout</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;newRegions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#createFsLayout-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-org.apache.hadoop.hbase.master.procedure.CreateTableProcedure.CreateHdfsRegions-">createFsLayout</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;newRegions,
               <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.CreateHdfsRegions.html" title="interface in org.apache.hadoop.hbase.master.procedure">CreateTableProcedure.CreateHdfsRegions</a>&nbsp;hdfsRegionHandler)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CloneSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.html#createFsLayout-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-org.apache.hadoop.hbase.master.procedure.CreateTableProcedure.CreateHdfsRegions-">createFsLayout</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
@@ -1109,24 +1117,24 @@
 <div class="block">Create region layout in file system.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.CreateHdfsRegions.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.CreateHdfsRegions.html#createHdfsRegions-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.TableName-java.util.List-">createHdfsRegions</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                  org.apache.hadoop.fs.Path&nbsp;tableRootDir,
                  <a href="../../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;newRegions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/MoveRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MoveRegionProcedure</a></code></td>
 <td class="colLast"><span class="typeNameLabel">ReopenTableRegionsProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html#createReopenProcedure-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.HRegionLocation-">createReopenProcedure</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                      <a href="../../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;loc)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.html#deleteAssignmentState-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-">deleteAssignmentState</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                      <a href="../../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterDDLOperationHelper.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterDDLOperationHelper.html#deleteColumnFamilyFromFileSystem-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-java.util.List-byte:A-boolean-">deleteColumnFamilyFromFileSystem</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                 <a href="../../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -1136,14 +1144,14 @@
 <div class="block">Remove the column family from the file system</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteNamespaceProcedure.html#deleteDirectory-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-java.lang.String-">deleteDirectory</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;namespaceName)</code>
 <div class="block">Delete the namespace directories from the file system</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">ModifyTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.html#deleteFromFs-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-org.apache.hadoop.hbase.client.TableDescriptor-">deleteFromFs</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
             <a href="../../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;oldTableDescriptor,
@@ -1151,26 +1159,34 @@
 <div class="block">Removes from hdfs the families that are not longer present in the new table descriptor.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.html#deleteFromFs-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-java.util.List-boolean-">deleteFromFs</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
             <a href="../../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
             boolean&nbsp;archive)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.html#deleteFromMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-java.util.List-">deleteFromMeta</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteNamespaceProcedure.html#deleteFromNSTable-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-java.lang.String-">deleteFromNSTable</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;namespaceName)</code>
 <div class="block">delete the row from namespace table</div>
 </td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">RestoreSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#deleteRegionsFromInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">deleteRegionsFromInMemoryStates</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos,
+                               <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                               int&nbsp;regionReplication)</code>
+<div class="block">Delete regions from in-memory states</div>
+</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.html#deleteTableDescriptorCache-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-">deleteTableDescriptorCache</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,

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


[12/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">145

<TRUNCATED>

[33/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html
index 5f41fe7..c8158b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html
@@ -524,636 +524,639 @@
 <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><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      if (!node.getTable().equals(tableName)) break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      regions.add(node);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return regions;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      if (!node.getTable().equals(tableName)) break;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      regions.add(node.toRegionState());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return regions;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      if (!node.getTable().equals(tableName)) break;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      regions.add(node.getRegionInfo());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    return regions;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    return regionsMap.values();<a name="line.547"></a>
+<span class="sourceLineNo">519</span>  public void deleteRegions(final List&lt;RegionInfo&gt; regionInfos) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    regionInfos.forEach(this::deleteRegion);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (!node.getTable().equals(tableName)) break;<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      regions.add(node);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return regions;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (!node.getTable().equals(tableName)) break;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      regions.add(node.toRegionState());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return regions;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      if (!node.getTable().equals(tableName)) break;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      regions.add(node.getRegionInfo());<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return regions;<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      regions.add(node.toRegionState());<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return regions;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  RegionState helpers<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  // ==========================================================================<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        return node.toRegionState();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  // ============================================================================================<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  //  TODO: helpers<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  // ============================================================================================<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    // TODO<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  /**<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return getRegionsOfTable(table, false);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    synchronized (node) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      if (!include(node, false)) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      if (node.isInState(State.OPEN)) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          node.getOpenSeqNum());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      } else if (node.isInState(State.OPENING)) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      } else {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        return null;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Get the regions to be reopened when modifying a table.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * &lt;p/&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<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>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p/&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * &lt;p/&gt;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * &lt;ul&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;/ul&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @param oldLoc the previous state/location of this region<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   *         means we still need to reopen the region.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    synchronized (node) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        // in OPEN state before<a name="line.644"></a>
-<span class="sourceLineNo">645</span>        if (node.isInState(State.OPEN)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>            // normal case, the region has been reopened<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            return null;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          } else {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            // the open seq num does not change, need to reopen again<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              node.getOpenSeqNum());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        } else {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          // finished maybe, but not a problem).<a name="line.656"></a>
-<span class="sourceLineNo">657</span>          return null;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      } else {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        // in OPENING state before<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          // reopened(not finished maybe, but not a problem)<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          return null;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        } else {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>          }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          // is changed to OPEN.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   */<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   *         {@link State#SPLIT} state.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      .collect(Collectors.toList());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * weed out split and offline regions.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   */<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (LOG.isTraceEnabled()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Returns the set of regions hosted by the specified server<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * @param serverName the server we are interested in<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * @return set of RegionInfo hosted by the specified server<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    synchronized (serverInfo) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return serverInfo.getRegionInfoList();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  // ============================================================================================<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  // Split helpers<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  // the ServerStateNode by calling removeServer.<a name="line.730"></a>
+<span class="sourceLineNo">550</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return regionsMap.values();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      regions.add(node.toRegionState());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return regions;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>  // ==========================================================================<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  //  RegionState helpers<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  // ==========================================================================<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        return node.toRegionState();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    return null;<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>  //  TODO: helpers<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  // ============================================================================================<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // TODO<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return getRegionsOfTable(table, false);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    synchronized (node) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      if (!include(node, false)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        return null;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      if (node.isInState(State.OPEN)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          node.getOpenSeqNum());<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      } else if (node.isInState(State.OPENING)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        return null;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Get the regions to be reopened when modifying a table.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * &lt;p/&gt;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * &lt;p/&gt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * &lt;p/&gt;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;ul&gt;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param oldLoc the previous state/location of this region<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   *         means we still need to reopen the region.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    synchronized (node) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // in OPEN state before<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        if (node.isInState(State.OPEN)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>            // normal case, the region has been reopened<a name="line.651"></a>
+<span class="sourceLineNo">652</span>            return null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>          } else {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            // the open seq num does not change, need to reopen again<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.655"></a>
+<span class="sourceLineNo">656</span>              node.getOpenSeqNum());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        } else {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // finished maybe, but not a problem).<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          return null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      } else {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        // in OPENING state before<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          // reopened(not finished maybe, but not a problem)<a name="line.667"></a>
+<span class="sourceLineNo">668</span>          return null;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        } else {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>            return null;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          // is changed to OPEN.<a name="line.675"></a>
+<span class="sourceLineNo">676</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        }<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      }<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   */<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *         {@link State#SPLIT} state.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   */<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      .collect(Collectors.toList());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<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>   * Utility. Whether to include region in list of regions. Default is to<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * weed out split and offline regions.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   */<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    if (LOG.isTraceEnabled()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.713"></a>
+<span class="sourceLineNo">714</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<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>   * Returns the set of regions hosted by the specified server<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param serverName the server we are interested in<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return set of RegionInfo hosted by the specified server<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>    synchronized (serverInfo) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      return serverInfo.getRegionInfoList();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
 <span class="sourceLineNo">731</span>  // ============================================================================================<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    synchronized (serverNode) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      serverNode.setState(state);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @see #metaLogSplit(ServerName)<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    setServerState(serverName, ServerState.SPLITTING_META);<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>  /**<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * @see #metaLogSplitting(ServerName)<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public void metaLogSplit(ServerName serverName) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   * Call this when we start log splitting for a crashed Server.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @see #logSplit(ServerName)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  public void logSplitting(final ServerName serverName) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    setServerState(serverName, ServerState.SPLITTING);<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>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Called after we've split all logs on a crashed Server.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * @see #logSplitting(ServerName)<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  public void logSplit(final ServerName serverName) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    synchronized (regionNode) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      regionNode.setState(state);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  // ============================================================================================<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  //  TODO:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  // ============================================================================================<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      if (!node.isInTransition()) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        result.add(node.getRegionInfo());<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    return result;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (region != null) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      synchronized (region) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        return region.isInState(state);<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>    return false;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    for (RegionInfo hri: regions) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      if (node == null) continue;<a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>      // TODO: State.OPEN<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      final ServerName serverName = node.getRegionLocation();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (serverName == null) continue;<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      if (serverRegions == null) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        result.put(serverName, serverRegions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      serverRegions.add(node.getRegionInfo());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    }<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return result;<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>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return assignments;<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>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    final State[] states = State.values();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<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>    for (RegionStateNode node: regionsMap.values()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      if (node.getTable().equals(tableName)) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    return tableRegions;<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>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (region != null) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      synchronized (region) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        ServerName server = region.getRegionLocation();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        return server != null ? server : region.getLastHost();<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>    return null;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Can't let out original since it can change and at least the load balancer<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return A clone of current assignments by table.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      final boolean forceByCluster) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<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>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt;(1);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return result;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      if (tableResult == null) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        tableResult = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        result.put(node.getTable(), tableResult);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      final ServerName serverName = node.getRegionLocation();<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      if (serverName == null) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.info("Skipping, no server for " + node);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        continue;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      List&lt;RegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      if (serverResult == null) {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        serverResult = new ArrayList&lt;RegionInfo&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        tableResult.put(serverName, serverResult);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      serverResult.add(node.getRegionInfo());<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add online servers with no assignment for the table.<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; table: result.values()) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        for (ServerName svr : serverMap.keySet()) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          if (!table.containsKey(svr)) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>            table.put(svr, new ArrayList&lt;RegionInfo&gt;());<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          }<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>    return result;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  // ==========================================================================<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  //  Region in transition helpers<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  // ==========================================================================<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      final RegionTransitionProcedure procedure) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return true;<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>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      final RegionTransitionProcedure procedure) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    regionNode.unsetProcedure(procedure);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>  public boolean hasRegionsInTransition() {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    return !regionInTransition.isEmpty();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>  public boolean isRegionInTransition(final RegionInfo regionInfo) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return node != null ? node.isInTransition() : false;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   */<a name="line.957"></a>
-<span class="sourceLineNo">958</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final RegionInfo hri) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (node == null) return null;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    return node.getProcedure();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
-<span class="sourceLineNo">963</span><a name="line.963"></a>
-<span class="sourceLineNo">964</span>  public RegionState getRegionTransitionState(final RegionInfo hri) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    if (node == null) return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>    synchronized (node) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      return node.isInTransition() ? node.toRegionState() : null;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>  /**<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * Get the number of regions in transition.<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  public int getRegionsInTransitionCount() {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    return regionInTransition.size();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>  }<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      rit.add(node.toRegionState());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    return rit;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      rit.add(node.toRegionState());<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return rit;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  //  Region offline helpers<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  // TODO: Unused.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public void removeFromOfflineRegions(final RegionInfo regionInfo) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    regionOffline.remove(regionInfo);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span><a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>  // ==========================================================================<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  //  Region FAIL_OPEN helpers<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  // ==========================================================================<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  public static final class RegionFailedOpen {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private final RegionStateNode regionNode;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    private volatile Exception exception = null;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    private AtomicInteger retries = new AtomicInteger();<a name="line.1021"></a>
+<span class="sourceLineNo">732</span>  // Split helpers<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  // the ServerStateNode by calling removeServer.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>  // ============================================================================================<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    synchronized (serverNode) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      serverNode.setState(state);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @see #metaLogSplit(ServerName)<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   */<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    setServerState(serverName, ServerState.SPLITTING_META);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @see #metaLogSplitting(ServerName)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public void metaLogSplit(ServerName serverName) {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * Call this when we start log splitting for a crashed Server.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @see #logSplit(ServerName)<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public void logSplitting(final ServerName serverName) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    setServerState(serverName, ServerState.SPLITTING);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  /**<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * Called after we've split all logs on a crashed Server.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * @see #logSplitting(ServerName)<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  public void logSplit(final ServerName serverName) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    synchronized (regionNode) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      regionNode.setState(state);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    }<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>  // ============================================================================================<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  //  TODO:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  // ============================================================================================<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      if (!node.isInTransition()) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        result.add(node.getRegionInfo());<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    return result;<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    if (region != null) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      synchronized (region) {<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        return region.isInState(state);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return false;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return isRegionInState(regionInfo, State.OPEN);<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionInfo hri: regions) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (node == null) continue;<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      // TODO: State.OPEN<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      final ServerName serverName = node.getRegionLocation();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      if (serverName == null) continue;<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (serverRegions == null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        result.put(serverName, serverRegions);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      serverRegions.add(node.getRegionInfo());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    return result;<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    return assignments;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    final State[] states = State.values();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      if (node.getTable().equals(tableName)) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<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>    return tableRegions;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    if (region != null) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      synchronized (region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        ServerName server = region.getRegionLocation();<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        return server != null ? server : region.getLastHost();<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      }<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    return null;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * Can't let out original since it can change and at least the load balancer<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * @return A clone of current assignments by table.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      final boolean forceByCluster) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInf

<TRUNCATED>

[39/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/ServerName.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ServerName.html b/devapidocs/src-html/org/apache/hadoop/hbase/ServerName.html
index f9b4f3e..88e84b4 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ServerName.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ServerName.html
@@ -35,156 +35,156 @@
 <span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.net.Address;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">030</span>import org.apache.hbase.thirdparty.com.google.common.collect.Interner;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hbase.thirdparty.com.google.common.collect.Interners;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hbase.thirdparty.com.google.common.net.InetAddresses;<a name="line.32"></a>
-<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
 <span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>/**<a name="line.35"></a>
-<span class="sourceLineNo">036</span> * Name of a particular incarnation of an HBase Server.<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * A {@link ServerName} is used uniquely identifying a server instance in a cluster and is made<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * of the combination of hostname, port, and startcode.  The startcode distinguishes restarted<a name="line.38"></a>
-<span class="sourceLineNo">039</span> * servers on same hostname and port (startcode is usually timestamp of server startup). The<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * {@link #toString()} format of ServerName is safe to use in the  filesystem and as znode name<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * up in ZooKeeper.  Its format is:<a name="line.41"></a>
-<span class="sourceLineNo">042</span> * &lt;code&gt;&amp;lt;hostname&amp;gt; '{@link #SERVERNAME_SEPARATOR}' &amp;lt;port&amp;gt;<a name="line.42"></a>
-<span class="sourceLineNo">043</span> * '{@link #SERVERNAME_SEPARATOR}' &amp;lt;startcode&amp;gt;&lt;/code&gt;.<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * For example, if hostname is &lt;code&gt;www.example.org&lt;/code&gt;, port is &lt;code&gt;1234&lt;/code&gt;,<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * and the startcode for the regionserver is &lt;code&gt;1212121212&lt;/code&gt;, then<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * the {@link #toString()} would be &lt;code&gt;www.example.org,1234,1212121212&lt;/code&gt;.<a name="line.46"></a>
-<span class="sourceLineNo">047</span> *<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * &lt;p&gt;You can obtain a versioned serialized form of this class by calling<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * {@link #getVersionedBytes()}.  To deserialize, call<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * {@link #parseVersionedServerName(byte[])}.<a name="line.50"></a>
-<span class="sourceLineNo">051</span> *<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * &lt;p&gt;Use {@link #getAddress()} to obtain the Server hostname + port<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * (Endpoint/Socket Address).<a name="line.53"></a>
-<span class="sourceLineNo">054</span> *<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;p&gt;Immutable.<a name="line.55"></a>
-<span class="sourceLineNo">056</span> */<a name="line.56"></a>
-<span class="sourceLineNo">057</span>@InterfaceAudience.Public<a name="line.57"></a>
-<span class="sourceLineNo">058</span>public class ServerName implements Comparable&lt;ServerName&gt;, Serializable {<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private static final long serialVersionUID = 1367463982557264981L;<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  /**<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * Version for this class.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * Its a short rather than a byte so I can for sure distinguish between this<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * version of this class and the version previous to this which did not have<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   * a version.<a name="line.65"></a>
-<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static final short VERSION = 0;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  static final byte [] VERSION_BYTES = Bytes.toBytes(VERSION);<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   * What to use if no startcode supplied.<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   */<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public static final int NON_STARTCODE = -1;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  /**<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * This character is used as separator between server hostname, port and<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * startcode.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   */<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String SERVERNAME_SEPARATOR = ",";<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  public static final Pattern SERVERNAME_PATTERN =<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    Pattern.compile("[^" + SERVERNAME_SEPARATOR + "]+" +<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX +<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX + "$");<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>   * What to use if server name is unknown.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   */<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final String UNKNOWN_SERVERNAME = "#unknown#";<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private final String servername;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private final long startcode;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private transient Address address;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * Cached versioned bytes of this ServerName instance.<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   * @see #getVersionedBytes()<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private byte [] bytes;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  public static final List&lt;ServerName&gt; EMPTY_SERVER_LIST = new ArrayList&lt;&gt;(0);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  protected ServerName(final String hostname, final int port, final long startcode) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    this(Address.fromParts(hostname, port), startcode);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private ServerName(final Address address, final long startcode) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    // Use HostAndPort to host port and hostname. Does validation and can do ipv6<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    this.address = address;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    this.startcode = startcode;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    this.servername = getServerName(this.address.getHostname(),<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        this.address.getPort(), startcode);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  private ServerName(final String serverName) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    this(parseHostname(serverName), parsePort(serverName),<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      parseStartcode(serverName));<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private ServerName(final String hostAndPort, final long startCode) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    this(Address.fromString(hostAndPort), startCode);<a name="line.120"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>/**<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * Name of a particular incarnation of an HBase Server.<a name="line.38"></a>
+<span class="sourceLineNo">039</span> * A {@link ServerName} is used uniquely identifying a server instance in a cluster and is made<a name="line.39"></a>
+<span class="sourceLineNo">040</span> * of the combination of hostname, port, and startcode.  The startcode distinguishes restarted<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * servers on same hostname and port (startcode is usually timestamp of server startup). The<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * {@link #toString()} format of ServerName is safe to use in the  filesystem and as znode name<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * up in ZooKeeper.  Its format is:<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * &lt;code&gt;&amp;lt;hostname&amp;gt; '{@link #SERVERNAME_SEPARATOR}' &amp;lt;port&amp;gt;<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * '{@link #SERVERNAME_SEPARATOR}' &amp;lt;startcode&amp;gt;&lt;/code&gt;.<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * For example, if hostname is &lt;code&gt;www.example.org&lt;/code&gt;, port is &lt;code&gt;1234&lt;/code&gt;,<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * and the startcode for the regionserver is &lt;code&gt;1212121212&lt;/code&gt;, then<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * the {@link #toString()} would be &lt;code&gt;www.example.org,1234,1212121212&lt;/code&gt;.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> *<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * &lt;p&gt;You can obtain a versioned serialized form of this class by calling<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * {@link #getVersionedBytes()}.  To deserialize, call<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * {@link #parseVersionedServerName(byte[])}.<a name="line.52"></a>
+<span class="sourceLineNo">053</span> *<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * &lt;p&gt;Use {@link #getAddress()} to obtain the Server hostname + port<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * (Endpoint/Socket Address).<a name="line.55"></a>
+<span class="sourceLineNo">056</span> *<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * &lt;p&gt;Immutable.<a name="line.57"></a>
+<span class="sourceLineNo">058</span> */<a name="line.58"></a>
+<span class="sourceLineNo">059</span>@InterfaceAudience.Public<a name="line.59"></a>
+<span class="sourceLineNo">060</span>public class ServerName implements Comparable&lt;ServerName&gt;, Serializable {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static final long serialVersionUID = 1367463982557264981L;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  /**<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * Version for this class.<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Its a short rather than a byte so I can for sure distinguish between this<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * version of this class and the version previous to this which did not have<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * a version.<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   */<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private static final short VERSION = 0;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  static final byte [] VERSION_BYTES = Bytes.toBytes(VERSION);<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * What to use if no startcode supplied.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  public static final int NON_STARTCODE = -1;<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  /**<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * This character is used as separator between server hostname, port and<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * startcode.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  public static final String SERVERNAME_SEPARATOR = ",";<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final Pattern SERVERNAME_PATTERN =<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    Pattern.compile("[^" + SERVERNAME_SEPARATOR + "]+" +<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX +<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX + "$");<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  /**<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * What to use if server name is unknown.<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public static final String UNKNOWN_SERVERNAME = "#unknown#";<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private final String servername;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private final long startcode;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private transient Address address;<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  /**<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * Cached versioned bytes of this ServerName instance.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * @see #getVersionedBytes()<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private byte [] bytes;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public static final List&lt;ServerName&gt; EMPTY_SERVER_LIST = new ArrayList&lt;&gt;(0);<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  /**<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * Intern ServerNames. The Set of ServerNames is mostly-fixed changing slowly as Servers<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * restart. Rather than create a new instance everytime, try and return existing instance<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * if there is one.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private static final Interner&lt;ServerName&gt; INTERN_POOL = Interners.newWeakInterner();<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  protected ServerName(final String hostname, final int port, final long startcode) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    this(Address.fromParts(hostname, port), startcode);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  private ServerName(final Address address, final long startcode) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // Use HostAndPort to host port and hostname. Does validation and can do ipv6<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    this.address = address;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    this.startcode = startcode;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    this.servername = getServerName(this.address.getHostname(),<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        this.address.getPort(), startcode);<a name="line.120"></a>
 <span class="sourceLineNo">121</span>  }<a name="line.121"></a>
 <span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * @param hostname<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * @return hostname minus the domain, if there is one (will do pass-through on ip addresses)<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * @deprecated Since 2.0. This is for internal use only.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   */<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  @Deprecated<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  // Make this private in hbase-3.0.<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  static String getHostNameMinusDomain(final String hostname) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    if (InetAddresses.isInetAddress(hostname)) return hostname;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    String [] parts = hostname.split("\\.");<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    if (parts == null || parts.length == 0) return hostname;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    return parts[0];<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  /**<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  @Deprecated<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  // This is unused. Get rid of it.<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static String parseHostname(final String serverName) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    if (serverName == null || serverName.length() &lt;= 0) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      throw new IllegalArgumentException("Passed hostname is null or empty");<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    if (!Character.isLetterOrDigit(serverName.charAt(0))) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      throw new IllegalArgumentException("Bad passed hostname, serverName=" + serverName);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    int index = serverName.indexOf(SERVERNAME_SEPARATOR);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    return serverName.substring(0, index);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  @Deprecated<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  // This is unused. Get rid of it.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  public static int parsePort(final String serverName) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    String [] split = serverName.split(SERVERNAME_SEPARATOR);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    return Integer.parseInt(split[1]);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  @Deprecated<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  // This is unused. Get rid of it.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public static long parseStartcode(final String serverName) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    int index = serverName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    return Long.parseLong(serverName.substring(index + 1));<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  /**<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * Retrieve an instance of ServerName.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * Callers should use the equals method to compare returned instances, though we may return<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * a shared immutable object as an internal optimization.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  public static ServerName valueOf(final String hostname, final int port, final long startcode) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    return new ServerName(hostname, port, startcode);<a name="line.179"></a>
+<span class="sourceLineNo">123</span>  private ServerName(final String serverName) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this(parseHostname(serverName), parsePort(serverName),<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      parseStartcode(serverName));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private ServerName(final String hostAndPort, final long startCode) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    this(Address.fromString(hostAndPort), startCode);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  /**<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param hostname<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @return hostname minus the domain, if there is one (will do pass-through on ip addresses)<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @deprecated Since 2.0. This is for internal use only.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  @Deprecated<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  // Make this private in hbase-3.0.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  static String getHostNameMinusDomain(final String hostname) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    if (InetAddresses.isInetAddress(hostname)) return hostname;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    String [] parts = hostname.split("\\.");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    if (parts == null || parts.length == 0) return hostname;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return parts[0];<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  /**<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   */<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  @Deprecated<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // This is unused. Get rid of it.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  public static String parseHostname(final String serverName) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    if (serverName == null || serverName.length() &lt;= 0) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      throw new IllegalArgumentException("Passed hostname is null or empty");<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    if (!Character.isLetterOrDigit(serverName.charAt(0))) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      throw new IllegalArgumentException("Bad passed hostname, serverName=" + serverName);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    int index = serverName.indexOf(SERVERNAME_SEPARATOR);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    return serverName.substring(0, index);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   */<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @Deprecated<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  // This is unused. Get rid of it.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  public static int parsePort(final String serverName) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    String [] split = serverName.split(SERVERNAME_SEPARATOR);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return Integer.parseInt(split[1]);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  @Deprecated<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  // This is unused. Get rid of it.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  public static long parseStartcode(final String serverName) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    int index = serverName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    return Long.parseLong(serverName.substring(index + 1));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>  }<a name="line.180"></a>
 <span class="sourceLineNo">181</span><a name="line.181"></a>
 <span class="sourceLineNo">182</span>  /**<a name="line.182"></a>
@@ -192,8 +192,8 @@
 <span class="sourceLineNo">184</span>   * Callers should use the equals method to compare returned instances, though we may return<a name="line.184"></a>
 <span class="sourceLineNo">185</span>   * a shared immutable object as an internal optimization.<a name="line.185"></a>
 <span class="sourceLineNo">186</span>   */<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  public static ServerName valueOf(final String serverName) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    return new ServerName(serverName);<a name="line.188"></a>
+<span class="sourceLineNo">187</span>  public static ServerName valueOf(final String hostname, final int port, final long startcode) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    return INTERN_POOL.intern(new ServerName(hostname, port, startcode));<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>
@@ -201,230 +201,239 @@
 <span class="sourceLineNo">193</span>   * Callers should use the equals method to compare returned instances, though we may return<a name="line.193"></a>
 <span class="sourceLineNo">194</span>   * a shared immutable object as an internal optimization.<a name="line.194"></a>
 <span class="sourceLineNo">195</span>   */<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public static ServerName valueOf(final String hostAndPort, final long startCode) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return new ServerName(hostAndPort, startCode);<a name="line.197"></a>
+<span class="sourceLineNo">196</span>  public static ServerName valueOf(final String serverName) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    return INTERN_POOL.intern(new ServerName(serverName));<a name="line.197"></a>
 <span class="sourceLineNo">198</span>  }<a name="line.198"></a>
 <span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  @Override<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  public String toString() {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    return getServerName();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  /**<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @return Return a SHORT version of {@link ServerName#toString()}, one that has the host only,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * minus the domain, and the port only -- no start code; the String is for us internally mostly<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * tying threads to their server.  Not for external use.  It is lossy and will not work in<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   * in compares, etc.<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  public String toShortString() {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return Addressing.createHostAndPortStr(<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        getHostNameMinusDomain(this.address.getHostname()),<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        this.address.getPort());<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   * @return {@link #getServerName()} as bytes with a short-sized prefix with<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * the ServerName#VERSION of this class.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  public synchronized byte [] getVersionedBytes() {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    if (this.bytes == null) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      this.bytes = Bytes.add(VERSION_BYTES, Bytes.toBytes(getServerName()));<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    return this.bytes;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>  public String getServerName() {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return servername;<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>  public String getHostname() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return this.address.getHostname();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public String getHostnameLowerCase() {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    return this.address.getHostname().toLowerCase(Locale.ROOT);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public int getPort() {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    return this.address.getPort();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  public long getStartcode() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    return startcode;<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>  /**<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * For internal use only.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * @param hostName<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @param port<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param startcode<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @return Server name made of the concatenation of hostname, port and<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * startcode formatted as &lt;code&gt;&amp;lt;hostname&amp;gt; ',' &amp;lt;port&amp;gt; ',' &amp;lt;startcode&amp;gt;&lt;/code&gt;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @deprecated Since 2.0. Use {@link ServerName#valueOf(String, int, long)} instead.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   */<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  @Deprecated<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  // TODO: Make this private in hbase-3.0.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  static String getServerName(String hostName, int port, long startcode) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    final StringBuilder name = new StringBuilder(hostName.length() + 1 + 5 + 1 + 13);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    name.append(hostName.toLowerCase(Locale.ROOT));<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    name.append(SERVERNAME_SEPARATOR);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    name.append(port);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    name.append(SERVERNAME_SEPARATOR);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    name.append(startcode);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return name.toString();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * @param hostAndPort String in form of &amp;lt;hostname&amp;gt; ':' &amp;lt;port&amp;gt;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * @param startcode<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * @return Server name made of the concatenation of hostname, port and<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * startcode formatted as &lt;code&gt;&amp;lt;hostname&amp;gt; ',' &amp;lt;port&amp;gt; ',' &amp;lt;startcode&amp;gt;&lt;/code&gt;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * @deprecated Since 2.0. Use {@link ServerName#valueOf(String, long)} instead.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @Deprecated<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  public static String getServerName(final String hostAndPort,<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      final long startcode) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    int index = hostAndPort.indexOf(":");<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    if (index &lt;= 0) throw new IllegalArgumentException("Expected &lt;hostname&gt; ':' &lt;port&gt;");<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    return getServerName(hostAndPort.substring(0, index),<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      Integer.parseInt(hostAndPort.substring(index + 1)), startcode);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * @return Hostname and port formatted as described at<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * {@link Addressing#createHostAndPortStr(String, int)}<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * @deprecated Since 2.0. Use {@link #getAddress()} instead.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   */<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @Deprecated<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  public String getHostAndPort() {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return this.address.toString();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  public Address getAddress() {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return this.address;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<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>   * @param serverName ServerName in form specified by {@link #getServerName()}<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * @return The server start code parsed from &lt;code&gt;servername&lt;/code&gt;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * @deprecated Since 2.0. Use instance of ServerName to pull out start code.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  @Deprecated<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public static long getServerStartcodeFromServerName(final String serverName) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int index = serverName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    return Long.parseLong(serverName.substring(index + 1));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * Utility method to excise the start code from a server name<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * @param inServerName full server name<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @return server name less its start code<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @deprecated Since 2.0. Use {@link #getAddress()}<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  @Deprecated<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static String getServerNameLessStartCode(String inServerName) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    if (inServerName != null &amp;&amp; inServerName.length() &gt; 0) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      int index = inServerName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      if (index &gt; 0) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        return inServerName.substring(0, index);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return inServerName;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  public int compareTo(ServerName other) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    int compare;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (other == null) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      return -1;<a name="line.331"></a>
+<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * Retrieve an instance of ServerName.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * Callers should use the equals method to compare returned instances, though we may return<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * a shared immutable object as an internal optimization.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static ServerName valueOf(final String hostAndPort, final long startCode) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    return INTERN_POOL.intern(new ServerName(hostAndPort, startCode));<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>  @Override<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  public String toString() {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return getServerName();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @return Return a SHORT version of {@link ServerName#toString()}, one that has the host only,<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * minus the domain, and the port only -- no start code; the String is for us internally mostly<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * tying threads to their server.  Not for external use.  It is lossy and will not work in<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * in compares, etc.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   */<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  public String toShortString() {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    return Addressing.createHostAndPortStr(<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        getHostNameMinusDomain(this.address.getHostname()),<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        this.address.getPort());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @return {@link #getServerName()} as bytes with a short-sized prefix with<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * the ServerName#VERSION of this class.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  public synchronized byte [] getVersionedBytes() {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    if (this.bytes == null) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.bytes = Bytes.add(VERSION_BYTES, Bytes.toBytes(getServerName()));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    return this.bytes;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  public String getServerName() {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    return servername;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public String getHostname() {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    return this.address.getHostname();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  public String getHostnameLowerCase() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    return this.address.getHostname().toLowerCase(Locale.ROOT);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public int getPort() {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    return this.address.getPort();<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  public long getStartcode() {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return startcode;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * For internal use only.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @param hostName<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * @param port<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * @param startcode<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * @return Server name made of the concatenation of hostname, port and<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * startcode formatted as &lt;code&gt;&amp;lt;hostname&amp;gt; ',' &amp;lt;port&amp;gt; ',' &amp;lt;startcode&amp;gt;&lt;/code&gt;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * @deprecated Since 2.0. Use {@link ServerName#valueOf(String, int, long)} instead.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  @Deprecated<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  // TODO: Make this private in hbase-3.0.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  static String getServerName(String hostName, int port, long startcode) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    final StringBuilder name = new StringBuilder(hostName.length() + 1 + 5 + 1 + 13);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    name.append(hostName.toLowerCase(Locale.ROOT));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    name.append(SERVERNAME_SEPARATOR);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    name.append(port);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    name.append(SERVERNAME_SEPARATOR);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    name.append(startcode);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    return name.toString();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param hostAndPort String in form of &amp;lt;hostname&amp;gt; ':' &amp;lt;port&amp;gt;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @param startcode<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @return Server name made of the concatenation of hostname, port and<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * startcode formatted as &lt;code&gt;&amp;lt;hostname&amp;gt; ',' &amp;lt;port&amp;gt; ',' &amp;lt;startcode&amp;gt;&lt;/code&gt;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * @deprecated Since 2.0. Use {@link ServerName#valueOf(String, long)} instead.<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   */<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @Deprecated<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  public static String getServerName(final String hostAndPort,<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      final long startcode) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    int index = hostAndPort.indexOf(":");<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (index &lt;= 0) throw new IllegalArgumentException("Expected &lt;hostname&gt; ':' &lt;port&gt;");<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return getServerName(hostAndPort.substring(0, index),<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      Integer.parseInt(hostAndPort.substring(index + 1)), startcode);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * @return Hostname and port formatted as described at<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * {@link Addressing#createHostAndPortStr(String, int)}<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @deprecated Since 2.0. Use {@link #getAddress()} instead.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Deprecated<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public String getHostAndPort() {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return this.address.toString();<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public Address getAddress() {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    return this.address;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * @param serverName ServerName in form specified by {@link #getServerName()}<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * @return The server start code parsed from &lt;code&gt;servername&lt;/code&gt;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * @deprecated Since 2.0. Use instance of ServerName to pull out start code.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  @Deprecated<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public static long getServerStartcodeFromServerName(final String serverName) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    int index = serverName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return Long.parseLong(serverName.substring(index + 1));<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  }<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>   * Utility method to excise the start code from a server name<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * @param inServerName full server name<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * @return server name less its start code<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * @deprecated Since 2.0. Use {@link #getAddress()}<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Deprecated<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public static String getServerNameLessStartCode(String inServerName) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (inServerName != null &amp;&amp; inServerName.length() &gt; 0) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      int index = inServerName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (index &gt; 0) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        return inServerName.substring(0, index);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
 <span class="sourceLineNo">332</span>    }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    if (this.getHostname() == null) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      if (other.getHostname() != null) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return 1;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    } else {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      if (other.getHostname() == null) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        return -1;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      compare = this.getHostname().compareToIgnoreCase(other.getHostname());<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      if (compare != 0) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        return compare;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    compare = this.getPort() - other.getPort();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    if (compare != 0) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      return compare;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    return Long.compare(this.getStartcode(), other.getStartcode());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  @Override<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  public int hashCode() {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    return getServerName().hashCode();<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  @Override<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public boolean equals(Object o) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    if (this == o) return true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    if (o == null) return false;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    if (!(o instanceof ServerName)) return false;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return this.compareTo((ServerName)o) == 0;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * @param left<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * @param right<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * @return True if &lt;code&gt;other&lt;/code&gt; has same hostname and port.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public static boolean isSameAddress(final ServerName left,<a name="line.371"></a>
-<span class="sourceLineNo">372</span>                                      final ServerName right) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    // TODO: Make this left.getAddress().equals(right.getAddress())<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    if (left == null) return false;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    if (right == null) return false;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return left.getHostname().compareToIgnoreCase(right.getHostname()) == 0 &amp;&amp;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      left.getPort() == right.getPort();<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>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Use this method instantiating a {@link ServerName} from bytes<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * gotten from a call to {@link #getVersionedBytes()}.  Will take care of the<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * case where bytes were written by an earlier version of hbase.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * @param versionedBytes Pass bytes gotten from a call to {@link #getVersionedBytes()}<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   * @return A ServerName instance.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * @see #getVersionedBytes()<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  public static ServerName parseVersionedServerName(final byte [] versionedBytes) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // Version is a short.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    short version = Bytes.toShort(versionedBytes);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    if (version == VERSION) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      int length = versionedBytes.length - Bytes.SIZEOF_SHORT;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      return valueOf(Bytes.toString(versionedBytes, Bytes.SIZEOF_SHORT, length));<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    // Presume the bytes were written with an old version of hbase and that the<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // bytes are actually a String of the form "'&lt;hostname&gt;' ':' '&lt;port&gt;'".<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    return valueOf(Bytes.toString(versionedBytes), NON_STARTCODE);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  /**<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @param str Either an instance of {@link ServerName#toString()} or a<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * "'&amp;lt;hostname&amp;gt;' ':' '&amp;lt;port&amp;gt;'".<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @return A ServerName instance.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   */<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  public static ServerName parseServerName(final String str) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    return SERVERNAME_PATTERN.matcher(str).matches()? valueOf(str) :<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        valueOf(str, NON_STARTCODE);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /**<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * @return true if the String follows the pattern of {@link ServerName#toString()}, false<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   *  otherwise.<a name="line.413"></a>
-<span class="sourceLineNo">414</span>   */<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  public static boolean isFullServerName(final String str){<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    if (str == null ||str.isEmpty()) return false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    return SERVERNAME_PATTERN.matcher(str).matches();<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">333</span>    return inServerName;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public int compareTo(ServerName other) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    int compare;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (other == null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      return -1;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (this.getHostname() == null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      if (other.getHostname() != null) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        return 1;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    } else {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      if (other.getHostname() == null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        return -1;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      compare = this.getHostname().compareToIgnoreCase(other.getHostname());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      if (compare != 0) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        return compare;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    compare = this.getPort() - other.getPort();<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    if (compare != 0) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      return compare;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    return Long.compare(this.getStartcode(), other.getStartcode());<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Override<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public int hashCode() {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return getServerName().hashCode();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  }<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  @Override<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public boolean equals(Object o) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    if (this == o) return true;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    if (o == null) return false;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (!(o instanceof ServerName)) return false;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return this.compareTo((ServerName)o) == 0;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>  /**<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * @param left<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @param right<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @return True if &lt;code&gt;other&lt;/code&gt; has same hostname and port.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static boolean isSameAddress(final ServerName left,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>                                      final ServerName right) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    // TODO: Make this left.getAddress().equals(right.getAddress())<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    if (left == null) return false;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    if (right == null) return false;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return left.getHostname().compareToIgnoreCase(right.getHostname()) == 0 &amp;&amp;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      left.getPort() == right.getPort();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   * Use this method instantiating a {@link ServerName} from bytes<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   * gotten from a call to {@link #getVersionedBytes()}.  Will take care of the<a name="line.391"></a>
+<span class="sourceLineNo">392</span>   * case where bytes were written by an earlier version of hbase.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @param versionedBytes Pass bytes gotten from a call to {@link #getVersionedBytes()}<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @return A ServerName instance.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @see #getVersionedBytes()<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public static ServerName parseVersionedServerName(final byte [] versionedBytes) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // Version is a short.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    short version = Bytes.toShort(versionedBytes);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    if (version == VERSION) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      int length = versionedBytes.length - Bytes.SIZEOF_SHORT;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      return valueOf(Bytes.toString(versionedBytes, Bytes.SIZEOF_SHORT, length));<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    // Presume the bytes were written with an old version of hbase and that the<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    // bytes are actually a String of the form "'&lt;hostname&gt;' ':' '&lt;port&gt;'".<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return valueOf(Bytes.toString(versionedBytes), NON_STARTCODE);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /**<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param str Either an instance of {@link ServerName#toString()} or a<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   * "'&amp;lt;hostname&amp;gt;' ':' '&amp;lt;port&amp;gt;'".<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return A ServerName instance.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  public static ServerName parseServerName(final String str) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    return SERVERNAME_PATTERN.matcher(str).matches()? valueOf(str) :<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        valueOf(str, NON_STARTCODE);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<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 String follows the pattern of {@link ServerName#toString()}, false<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   *  otherwise.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  public static boolean isFullServerName(final String str){<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    if (str == null ||str.isEmpty()) return false;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return SERVERNAME_PATTERN.matcher(str).matches();<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 51e1434..e44cfd7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "03e596c6694a21768c51a3c52e1a032f51fd637c";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "b4759ce6e72f50ccd9d410bd5917dc5a515414f1";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Fri Jul 20 14:39:51 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sun Jul 22 09:20:24 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "a65d367fbccbdba17726b7d3fb69e5b3";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "3449ee861188a2ccacfbd7a165550672";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html
index f2266e9..8e1c20f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html
@@ -277,45 +277,49 @@
 <span class="sourceLineNo">269</span>    return result;<a name="line.269"></a>
 <span class="sourceLineNo">270</span>  }<a name="line.270"></a>
 <span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  public synchronized void deleteFavoredNodesForRegions(Collection&lt;RegionInfo&gt; regionInfoList) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    for (RegionInfo hri : regionInfoList) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      List&lt;ServerName&gt; favNodes = getFavoredNodes(hri);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      if (favNodes != null) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        if (primaryRSToRegionMap.containsKey(favNodes.get(PRIMARY.ordinal()))) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          primaryRSToRegionMap.get(favNodes.get(PRIMARY.ordinal())).remove(hri);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        if (secondaryRSToRegionMap.containsKey(favNodes.get(SECONDARY.ordinal()))) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          secondaryRSToRegionMap.get(favNodes.get(SECONDARY.ordinal())).remove(hri);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        if (teritiaryRSToRegionMap.containsKey(favNodes.get(TERTIARY.ordinal()))) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          teritiaryRSToRegionMap.get(favNodes.get(TERTIARY.ordinal())).remove(hri);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        globalFavoredNodesAssignmentPlan.removeFavoredNodes(hri);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>  }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @VisibleForTesting<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  public synchronized Set&lt;RegionInfo&gt; getRegionsOfFavoredNode(ServerName serverName) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    Set&lt;RegionInfo&gt; regionInfos = Sets.newHashSet();<a name="line.292"></a>
+<span class="sourceLineNo">272</span>  public synchronized void deleteFavoredNodesForRegion(RegionInfo regionInfo) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    List&lt;ServerName&gt; favNodes = getFavoredNodes(regionInfo);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    if (favNodes != null) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      if (primaryRSToRegionMap.containsKey(favNodes.get(PRIMARY.ordinal()))) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        primaryRSToRegionMap.get(favNodes.get(PRIMARY.ordinal())).remove(regionInfo);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      if (secondaryRSToRegionMap.containsKey(favNodes.get(SECONDARY.ordinal()))) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        secondaryRSToRegionMap.get(favNodes.get(SECONDARY.ordinal())).remove(regionInfo);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      if (teritiaryRSToRegionMap.containsKey(favNodes.get(TERTIARY.ordinal()))) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        teritiaryRSToRegionMap.get(favNodes.get(TERTIARY.ordinal())).remove(regionInfo);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      globalFavoredNodesAssignmentPlan.removeFavoredNodes(regionInfo);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public synchronized void deleteFavoredNodesForRegions(Collection&lt;RegionInfo&gt; regionInfoList) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    for (RegionInfo regionInfo : regionInfoList) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      deleteFavoredNodesForRegion(regionInfo);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
 <span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>    ServerName serverToUse = ServerName.valueOf(serverName.getHostAndPort(), NON_STARTCODE);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    if (primaryRSToRegionMap.containsKey(serverToUse)) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      regionInfos.addAll(primaryRSToRegionMap.get(serverToUse));<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    if (secondaryRSToRegionMap.containsKey(serverToUse)) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      regionInfos.addAll(secondaryRSToRegionMap.get(serverToUse));<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    if (teritiaryRSToRegionMap.containsKey(serverToUse)) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      regionInfos.addAll(teritiaryRSToRegionMap.get(serverToUse));<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    return regionInfos;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  }<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>  public RackManager getRackManager() {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    return rackManager;<a name="line.308"></a>
+<span class="sourceLineNo">294</span>  @VisibleForTesting<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  public synchronized Set&lt;RegionInfo&gt; getRegionsOfFavoredNode(ServerName serverName) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    Set&lt;RegionInfo&gt; regionInfos = Sets.newHashSet();<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    ServerName serverToUse = ServerName.valueOf(serverName.getHostAndPort(), NON_STARTCODE);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    if (primaryRSToRegionMap.containsKey(serverToUse)) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      regionInfos.addAll(primaryRSToRegionMap.get(serverToUse));<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    if (secondaryRSToRegionMap.containsKey(serverToUse)) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      regionInfos.addAll(secondaryRSToRegionMap.get(serverToUse));<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    if (teritiaryRSToRegionMap.containsKey(serverToUse)) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      regionInfos.addAll(teritiaryRSToRegionMap.get(serverToUse));<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    return regionInfos;<a name="line.308"></a>
 <span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>}<a name="line.310"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public RackManager getRackManager() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    return rackManager;<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>
 
 
 


[48/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index a80572d..bc1d57c 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3690,
-             Errors: 15669,
+             Errors: 15670,
              Warnings: 0,
              Infos: 0
       </title>
@@ -45289,7 +45289,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  24
+                  25
                 </td>
               </tr>
                           <tr>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 630d8a4..402c4d2 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180720" />
+    <meta name="Date-Revision-yyyymmdd" content="20180722" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-07-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-07-22</li>
             </p>
                 </div>
 

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 4b37b51..15c4f42 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3789,21 +3789,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Fri Jul 20 14:39:51 UTC 2018"</code></td>
+<td class="colLast"><code>"Sun Jul 22 09:20:24 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"03e596c6694a21768c51a3c52e1a032f51fd637c"</code></td>
+<td class="colLast"><code>"b4759ce6e72f50ccd9d410bd5917dc5a515414f1"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"a65d367fbccbdba17726b7d3fb69e5b3"</code></td>
+<td class="colLast"><code>"3449ee861188a2ccacfbd7a165550672"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 48d9ba3..4522509 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -2199,6 +2199,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MetaTableAccessor.html#addRegionStateToPut-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.master.RegionState.State-">addRegionStateToPut(Put, RegionState.State)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MetaTableAccessor.html" title="class in org.apache.hadoop.hbase">MetaTableAccessor</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#addRegionsToInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">addRegionsToInMemoryStates(List&lt;RegionInfo&gt;, MasterProcedureEnv, int)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">RestoreSnapshotProcedure</a></dt>
+<dd>
+<div class="block">Add regions to in-memory states</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.html#addRegionsToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-">addRegionsToMeta(MasterProcedureEnv)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">CloneSnapshotProcedure</a></dt>
 <dd>
 <div class="block">Add regions to hbase:meta table.</div>
@@ -24476,6 +24480,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterFileSystem.html#deleteFamilyFromFS-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.client.RegionInfo-byte:A-">deleteFamilyFromFS(Path, RegionInfo, byte[])</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/favored/FavoredNodesManager.html#deleteFavoredNodesForRegion-org.apache.hadoop.hbase.client.RegionInfo-">deleteFavoredNodesForRegion(RegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.favored.<a href="org/apache/hadoop/hbase/favored/FavoredNodesManager.html" title="class in org.apache.hadoop.hbase.favored">FavoredNodesManager</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/favored/FavoredNodesManager.html#deleteFavoredNodesForRegions-java.util.Collection-">deleteFavoredNodesForRegions(Collection&lt;RegionInfo&gt;)</a></span> - Method in class org.apache.hadoop.hbase.favored.<a href="org/apache/hadoop/hbase/favored/FavoredNodesManager.html" title="class in org.apache.hadoop.hbase.favored">FavoredNodesManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html#deleteFile-org.apache.hadoop.fs.FileStatus-">deleteFile(FileStatus)</a></span> - Method in class org.apache.hadoop.hbase.master.cleaner.<a href="org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">HFileCleaner</a></dt>
@@ -24702,6 +24708,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html#deleteRegionManifest-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest-">deleteRegionManifest(FileSystem, Path, SnapshotProtos.SnapshotRegionManifest)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifestV2</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html#deleteRegions-java.util.List-">deleteRegions(List&lt;RegionInfo&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionStateStore.html#deleteRegions-java.util.List-">deleteRegions(List&lt;RegionInfo&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionStateStore.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateStore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MetaTableAccessor.html#deleteRegions-org.apache.hadoop.hbase.client.Connection-java.util.List-">deleteRegions(Connection, List&lt;RegionInfo&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MetaTableAccessor.html" title="class in org.apache.hadoop.hbase">MetaTableAccessor</a></dt>
@@ -24712,6 +24720,10 @@
 <dd>
 <div class="block">Deletes the specified regions from META.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#deleteRegionsFromInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">deleteRegionsFromInMemoryStates(List&lt;RegionInfo&gt;, MasterProcedureEnv, int)</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">RestoreSnapshotProcedure</a></dt>
+<dd>
+<div class="block">Delete regions from in-memory states</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/HFileArchiver.html#deleteRegionWithoutArchiving-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">deleteRegionWithoutArchiving(FileSystem, Path)</a></span> - Static method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/HFileArchiver.html" title="class in org.apache.hadoop.hbase.backup">HFileArchiver</a></dt>
 <dd>
 <div class="block">Without regard for backup, delete a region.</div>
@@ -61309,6 +61321,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/CacheStats.html#intermediateIndexMissCount">intermediateIndexMissCount</a></span> - Variable in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ServerName.html#INTERN_POOL">INTERN_POOL</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></dt>
+<dd>
+<div class="block">Intern ServerNames.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#internalAdd-org.apache.hadoop.hbase.regionserver.MutableSegment-org.apache.hadoop.hbase.Cell-boolean-org.apache.hadoop.hbase.regionserver.MemStoreSizing-">internalAdd(MutableSegment, Cell, boolean, MemStoreSizing)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.html#internalAdd-org.apache.hadoop.hbase.Cell-boolean-org.apache.hadoop.hbase.regionserver.MemStoreSizing-boolean-">internalAdd(Cell, boolean, MemStoreSizing, boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">CompositeImmutableSegment</a></dt>
@@ -90093,7 +90109,7 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html" title="class in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">RegionReplicaReplicationEndpoint.RetryingRpcCallable</span></a>&lt;<a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html" title="type parameter in RegionReplicaReplicationEndpoint.RetryingRpcCallable">V</a>&gt; - Class in <a href="org/apache/hadoop/hbase/replication/regionserver/package-summary.html">org.apache.hadoop.hbase.replication.regionserver</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-">RegionReplicaSinkWriter(RegionReplicaReplicationEndpoint.RegionReplicaOutputSink, ClusterConnection, ExecutorService, int)</a></span> - Constructor for class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-org.apache.hadoop.hbase.TableDescriptors-">RegionReplicaSinkWriter(RegionReplicaReplicationEndpoint.RegionReplicaOutputSink, ClusterConnection, ExecutorService, int, TableDescriptors)</a></span> - Constructor for class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.html#regionReplication">regionReplication</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.html" title="class in org.apache.hadoop.hbase.client">ScannerCallableWithReplicas</a></dt>
 <dd>&nbsp;</dd>
@@ -111270,6 +111286,8 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#tableDescriptors">tableDescriptors</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#tableDescriptors">tableDescriptors</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#tableDescriptors">tableDescriptors</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/ReplicationEndpoint.Context.html#tableDescriptors">tableDescriptors</a></span> - Variable in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/ReplicationEndpoint.Context.html" title="class in org.apache.hadoop.hbase.replication">ReplicationEndpoint.Context</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/ServerName.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ServerName.html b/devapidocs/org/apache/hadoop/hbase/ServerName.html
index 13a8749..415dc34 100644
--- a/devapidocs/org/apache/hadoop/hbase/ServerName.html
+++ b/devapidocs/org/apache/hadoop/hbase/ServerName.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.58">ServerName</a>
+public class <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.60">ServerName</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;, <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a></pre>
 <div class="block">Name of a particular incarnation of an HBase Server.
@@ -178,47 +178,53 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#EMPTY_SERVER_LIST">EMPTY_SERVER_LIST</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hbase.thirdparty.com.google.common.collect.Interner&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#INTERN_POOL">INTERN_POOL</a></span></code>
+<div class="block">Intern ServerNames.</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#NON_STARTCODE">NON_STARTCODE</a></span></code>
 <div class="block">What to use if no startcode supplied.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#serialVersionUID">serialVersionUID</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#servername">servername</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html?is-external=true" title="class or interface in java.util.regex">Pattern</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#SERVERNAME_PATTERN">SERVERNAME_PATTERN</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#SERVERNAME_SEPARATOR">SERVERNAME_SEPARATOR</a></span></code>
 <div class="block">This character is used as separator between server hostname, port and
  startcode.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#startcode">startcode</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#UNKNOWN_SERVERNAME">UNKNOWN_SERVERNAME</a></span></code>
 <div class="block">What to use if server name is unknown.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static short</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#VERSION">VERSION</a></span></code>
 <div class="block">Version for this class.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) static byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/ServerName.html#VERSION_BYTES">VERSION_BYTES</a></span></code>&nbsp;</td>
 </tr>
@@ -464,7 +470,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>serialVersionUID</h4>
-<pre>private static final&nbsp;long <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.59">serialVersionUID</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.61">serialVersionUID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.ServerName.serialVersionUID">Constant Field Values</a></dd>
@@ -477,7 +483,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>VERSION</h4>
-<pre>private static final&nbsp;short <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.67">VERSION</a></pre>
+<pre>private static final&nbsp;short <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.69">VERSION</a></pre>
 <div class="block">Version for this class.
  Its a short rather than a byte so I can for sure distinguish between this
  version of this class and the version previous to this which did not have
@@ -494,7 +500,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>VERSION_BYTES</h4>
-<pre>static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.68">VERSION_BYTES</a></pre>
+<pre>static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.70">VERSION_BYTES</a></pre>
 </li>
 </ul>
 <a name="NON_STARTCODE">
@@ -503,7 +509,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>NON_STARTCODE</h4>
-<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.73">NON_STARTCODE</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.75">NON_STARTCODE</a></pre>
 <div class="block">What to use if no startcode supplied.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -517,7 +523,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>SERVERNAME_SEPARATOR</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.79">SERVERNAME_SEPARATOR</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.81">SERVERNAME_SEPARATOR</a></pre>
 <div class="block">This character is used as separator between server hostname, port and
  startcode.</div>
 <dl>
@@ -532,7 +538,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>SERVERNAME_PATTERN</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html?is-external=true" title="class or interface in java.util.regex">Pattern</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.81">SERVERNAME_PATTERN</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html?is-external=true" title="class or interface in java.util.regex">Pattern</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.83">SERVERNAME_PATTERN</a></pre>
 </li>
 </ul>
 <a name="UNKNOWN_SERVERNAME">
@@ -541,7 +547,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>UNKNOWN_SERVERNAME</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.89">UNKNOWN_SERVERNAME</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.91">UNKNOWN_SERVERNAME</a></pre>
 <div class="block">What to use if server name is unknown.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -555,7 +561,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>servername</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.91">servername</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.93">servername</a></pre>
 </li>
 </ul>
 <a name="startcode">
@@ -564,7 +570,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>startcode</h4>
-<pre>private final&nbsp;long <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.92">startcode</a></pre>
+<pre>private final&nbsp;long <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.94">startcode</a></pre>
 </li>
 </ul>
 <a name="address">
@@ -573,7 +579,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>address</h4>
-<pre>private transient&nbsp;<a href="../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.93">address</a></pre>
+<pre>private transient&nbsp;<a href="../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a> <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.95">address</a></pre>
 </li>
 </ul>
 <a name="bytes">
@@ -582,7 +588,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>bytes</h4>
-<pre>private&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.99">bytes</a></pre>
+<pre>private&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.101">bytes</a></pre>
 <div class="block">Cached versioned bytes of this ServerName instance.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -593,10 +599,22 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <a name="EMPTY_SERVER_LIST">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>EMPTY_SERVER_LIST</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.100">EMPTY_SERVER_LIST</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.102">EMPTY_SERVER_LIST</a></pre>
+</li>
+</ul>
+<a name="INTERN_POOL">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>INTERN_POOL</h4>
+<pre>private static final&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.Interner&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.109">INTERN_POOL</a></pre>
+<div class="block">Intern ServerNames. The Set of ServerNames is mostly-fixed changing slowly as Servers
+ restart. Rather than create a new instance everytime, try and return existing instance
+ if there is one.</div>
 </li>
 </ul>
 </li>
@@ -613,7 +631,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>ServerName</h4>
-<pre>protected&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.102">ServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname,
+<pre>protected&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.111">ServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname,
                      int&nbsp;port,
                      long&nbsp;startcode)</pre>
 </li>
@@ -624,7 +642,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>ServerName</h4>
-<pre>private&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.106">ServerName</a>(<a href="../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&nbsp;address,
+<pre>private&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.115">ServerName</a>(<a href="../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&nbsp;address,
                    long&nbsp;startcode)</pre>
 </li>
 </ul>
@@ -634,7 +652,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>ServerName</h4>
-<pre>private&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.114">ServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+<pre>private&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.123">ServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="ServerName-java.lang.String-long-">
@@ -643,7 +661,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ServerName</h4>
-<pre>private&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.119">ServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
+<pre>private&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.128">ServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
                    long&nbsp;startCode)</pre>
 </li>
 </ul>
@@ -662,7 +680,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <li class="blockList">
 <h4>getHostNameMinusDomain</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.130">getHostNameMinusDomain</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname)</pre>
+static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.139">getHostNameMinusDomain</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. This is for internal use only.</span></div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -679,7 +697,7 @@ static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <li class="blockList">
 <h4>parseHostname</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.142">parseHostname</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.151">parseHostname</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>valueOf(String)</code></a></span></div>
 </li>
 </ul>
@@ -690,7 +708,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <li class="blockList">
 <h4>parsePort</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.158">parsePort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.167">parsePort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>valueOf(String)</code></a></span></div>
 </li>
 </ul>
@@ -701,7 +719,7 @@ public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbas
 <li class="blockList">
 <h4>parseStartcode</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.168">parseStartcode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.177">parseStartcode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>valueOf(String)</code></a></span></div>
 </li>
 </ul>
@@ -711,7 +729,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.178">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.187">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostname,
                                  int&nbsp;port,
                                  long&nbsp;startcode)</pre>
 <div class="block">Retrieve an instance of ServerName.
@@ -725,7 +743,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.187">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.196">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block">Retrieve an instance of ServerName.
  Callers should use the equals method to compare returned instances, though we may return
  a shared immutable object as an internal optimization.</div>
@@ -737,7 +755,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.196">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.205">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
                                  long&nbsp;startCode)</pre>
 <div class="block">Retrieve an instance of ServerName.
  Callers should use the equals method to compare returned instances, though we may return
@@ -750,7 +768,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.201">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.210">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -763,7 +781,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>toShortString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.211">toShortString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.220">toShortString</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return a SHORT version of <a href="../../../../org/apache/hadoop/hbase/ServerName.html#toString--"><code>toString()</code></a>, one that has the host only,
@@ -779,7 +797,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getVersionedBytes</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.221">getVersionedBytes</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.230">getVersionedBytes</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd><a href="../../../../org/apache/hadoop/hbase/ServerName.html#getServerName--"><code>getServerName()</code></a> as bytes with a short-sized prefix with
@@ -793,7 +811,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.228">getServerName</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.237">getServerName</a>()</pre>
 </li>
 </ul>
 <a name="getHostname--">
@@ -802,7 +820,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getHostname</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.232">getHostname</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.241">getHostname</a>()</pre>
 </li>
 </ul>
 <a name="getHostnameLowerCase--">
@@ -811,7 +829,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getHostnameLowerCase</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.236">getHostnameLowerCase</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.245">getHostnameLowerCase</a>()</pre>
 </li>
 </ul>
 <a name="getPort--">
@@ -820,7 +838,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getPort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.240">getPort</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.249">getPort</a>()</pre>
 </li>
 </ul>
 <a name="getStartcode--">
@@ -829,7 +847,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartcode</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.244">getStartcode</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.253">getStartcode</a>()</pre>
 </li>
 </ul>
 <a name="getServerName-java.lang.String-int-long-">
@@ -839,7 +857,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <li class="blockList">
 <h4>getServerName</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.259">getServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostName,
+static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.268">getServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostName,
                                         int&nbsp;port,
                                         long&nbsp;startcode)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-int-long-"><code>valueOf(String, int, long)</code></a> instead.</span></div>
@@ -862,7 +880,7 @@ static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <li class="blockList">
 <h4>getServerName</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.277">getServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
+public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.286">getServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;hostAndPort,
                                                long&nbsp;startcode)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-long-"><code>valueOf(String, long)</code></a> instead.</span></div>
 <dl>
@@ -882,7 +900,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <li class="blockList">
 <h4>getHostAndPort</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.291">getHostAndPort</a>()</pre>
+public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.300">getHostAndPort</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#getAddress--"><code>getAddress()</code></a> instead.</span></div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -897,7 +915,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getAddress</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.295">getAddress</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.304">getAddress</a>()</pre>
 </li>
 </ul>
 <a name="getServerStartcodeFromServerName-java.lang.String-">
@@ -907,7 +925,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <li class="blockList">
 <h4>getServerStartcodeFromServerName</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.305">getServerStartcodeFromServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
+public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.314">getServerStartcodeFromServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;serverName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use instance of ServerName to pull out start code.</span></div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -924,7 +942,7 @@ public static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hba
 <li class="blockList">
 <h4>getServerNameLessStartCode</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.317">getServerNameLessStartCode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;inServerName)</pre>
+public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.326">getServerNameLessStartCode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;inServerName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0. Use <a href="../../../../org/apache/hadoop/hbase/ServerName.html#getAddress--"><code>getAddress()</code></a></span></div>
 <div class="block">Utility method to excise the start code from a server name</div>
 <dl>
@@ -941,7 +959,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.328">compareTo</a>(<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;other)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.337">compareTo</a>(<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;other)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></dd>
@@ -954,7 +972,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.354">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.363">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -967,7 +985,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.359">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.368">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -980,7 +998,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>isSameAddress</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.371">isSameAddress</a>(<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;left,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.380">isSameAddress</a>(<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;left,
                                     <a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;right)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -997,7 +1015,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>parseVersionedServerName</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.388">parseVersionedServerName</a>(byte[]&nbsp;versionedBytes)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.397">parseVersionedServerName</a>(byte[]&nbsp;versionedBytes)</pre>
 <div class="block">Use this method instantiating a <a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase"><code>ServerName</code></a> from bytes
  gotten from a call to <a href="../../../../org/apache/hadoop/hbase/ServerName.html#getVersionedBytes--"><code>getVersionedBytes()</code></a>.  Will take care of the
  case where bytes were written by an earlier version of hbase.</div>
@@ -1017,7 +1035,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockList">
 <li class="blockList">
 <h4>parseServerName</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.405">parseServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;str)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.414">parseServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;str)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>str</code> - Either an instance of <a href="../../../../org/apache/hadoop/hbase/ServerName.html#toString--"><code>toString()</code></a> or a
@@ -1033,7 +1051,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isFullServerName</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.415">isFullServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;str)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/ServerName.html#line.424">isFullServerName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;str)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if the String follows the pattern of <a href="../../../../org/apache/hadoop/hbase/ServerName.html#toString--"><code>toString()</code></a>, false

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
index a7b714f..58fa218 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
@@ -279,10 +279,16 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast"><span class="typeNameLabel">ServerName.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/ServerName.html#EMPTY_SERVER_LIST">EMPTY_SERVER_LIST</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hbase.thirdparty.com.google.common.collect.Interner&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">ServerName.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/ServerName.html#INTERN_POOL">INTERN_POOL</a></span></code>
+<div class="block">Intern ServerNames.</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerMetrics.html" title="interface in org.apache.hadoop.hbase">ServerMetrics</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">ClusterMetricsBuilder.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/ClusterMetricsBuilder.html#liveServerMetrics">liveServerMetrics</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerMetrics.html" title="interface in org.apache.hadoop.hbase">ServerMetrics</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">ClusterMetricsBuilder.ClusterMetricsImpl.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/ClusterMetricsBuilder.ClusterMetricsImpl.html#liveServerMetrics">liveServerMetrics</a></span></code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/class-use/TableDescriptors.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/TableDescriptors.html b/devapidocs/org/apache/hadoop/hbase/class-use/TableDescriptors.html
index 72d579d..2a7d3d4 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/TableDescriptors.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/TableDescriptors.html
@@ -251,6 +251,10 @@
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a></code></td>
 <td class="colLast"><span class="typeNameLabel">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#tableDescriptors">tableDescriptors</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a></code></td>
+<td class="colLast"><span class="typeNameLabel">RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#tableDescriptors">tableDescriptors</a></span></code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing constructors, and an explanation">
@@ -268,6 +272,13 @@
                        int&nbsp;numWriters,
                        int&nbsp;operationTimeout)</code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-org.apache.hadoop.hbase.TableDescriptors-">RegionReplicaSinkWriter</a></span>(<a href="../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
+                       <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool,
+                       int&nbsp;operationTimeout,
+                       <a href="../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a>&nbsp;tableDescriptors)</code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/client/class-use/ClusterConnection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/ClusterConnection.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/ClusterConnection.html
index 162a27f..1086383 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/ClusterConnection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/ClusterConnection.html
@@ -756,10 +756,11 @@
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a>&nbsp;skippedEntries)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-">RegionReplicaSinkWriter</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-org.apache.hadoop.hbase.TableDescriptors-">RegionReplicaSinkWriter</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
                        <a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool,
-                       int&nbsp;operationTimeout)</code>&nbsp;</td>
+                       int&nbsp;operationTimeout,
+                       <a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a>&nbsp;tableDescriptors)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSinkManager.html#ReplicationSinkManager-org.apache.hadoop.hbase.client.ClusterConnection-java.lang.String-org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint-org.apache.hadoop.conf.Configuration-">ReplicationSinkManager</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;conn,


[02/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html
index 3d7093a..9917ee8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html
@@ -39,594 +39,612 @@
 <span class="sourceLineNo">031</span>import java.util.concurrent.ThreadPoolExecutor;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.TimeUnit;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.Path;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.TableName;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ClusterConnection;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionAdminServiceCallable;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RegionInfo;<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.RetryingCallable;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RpcRetryingCallerFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.ipc.HBaseRpcController;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.replication.WALEntryFilter;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.wal.WALSplitter.EntryBuffers;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.wal.WALSplitter.OutputSink;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.wal.WALSplitter.PipelineController;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.wal.WALSplitter.RegionEntryBuffer;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.wal.WALSplitter.SinkWriter;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.util.StringUtils;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.slf4j.Logger;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.slf4j.LoggerFactory;<a name="line.72"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.conf.Configuration;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.Path;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HConstants;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableName;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.ClusterConnection;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.RegionAdminServiceCallable;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RetryingCallable;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.RpcRetryingCallerFactory;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.ipc.HBaseRpcController;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.replication.WALEntryFilter;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.wal.WALSplitter.EntryBuffers;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.wal.WALSplitter.OutputSink;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.wal.WALSplitter.PipelineController;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.wal.WALSplitter.RegionEntryBuffer;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.wal.WALSplitter.SinkWriter;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.util.StringUtils;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.slf4j.Logger;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.slf4j.LoggerFactory;<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
 <span class="sourceLineNo">073</span>import org.apache.hbase.thirdparty.com.google.common.cache.Cache;<a name="line.73"></a>
 <span class="sourceLineNo">074</span>import org.apache.hbase.thirdparty.com.google.common.cache.CacheBuilder;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse;<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>/**<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * A {@link org.apache.hadoop.hbase.replication.ReplicationEndpoint} endpoint<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * which receives the WAL edits from the WAL, and sends the edits to replicas<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * of regions.<a name="line.81"></a>
-<span class="sourceLineNo">082</span> */<a name="line.82"></a>
-<span class="sourceLineNo">083</span>@InterfaceAudience.Private<a name="line.83"></a>
-<span class="sourceLineNo">084</span>public class RegionReplicaReplicationEndpoint extends HBaseReplicationEndpoint {<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private static final Logger LOG = LoggerFactory.getLogger(RegionReplicaReplicationEndpoint.class);<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  // Can be configured differently than hbase.client.retries.number<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private static String CLIENT_RETRIES_NUMBER<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    = "hbase.region.replica.replication.client.retries.number";<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private Configuration conf;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private ClusterConnection connection;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private TableDescriptors tableDescriptors;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>  // Reuse WALSplitter constructs as a WAL pipe<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private PipelineController controller;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private RegionReplicaOutputSink outputSink;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private EntryBuffers entryBuffers;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  // Number of writer threads<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private int numWriterThreads;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private int operationTimeout;<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private ExecutorService pool;<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void init(Context context) throws IOException {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    super.init(context);<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    this.conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    this.tableDescriptors = context.getTableDescriptors();<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // HRS multiplies client retries by 10 globally for meta operations, but we do not want this.<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    // We are resetting it here because we want default number of retries (35) rather than 10 times<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // that which makes very long retries for disabled tables etc.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    int defaultNumRetries = conf.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (defaultNumRetries &gt; 10) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      int mult = conf.getInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        HConstants.DEFAULT_HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      defaultNumRetries = defaultNumRetries / mult; // reset if HRS has multiplied this already<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    }<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>    conf.setInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER, 1);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    int numRetries = conf.getInt(CLIENT_RETRIES_NUMBER, defaultNumRetries);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, numRetries);<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this.numWriterThreads = this.conf.getInt(<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      "hbase.region.replica.replication.writer.threads", 3);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    controller = new PipelineController();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    entryBuffers = new EntryBuffers(controller,<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.conf.getInt("hbase.region.replica.replication.buffersize",<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          128*1024*1024));<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // use the regular RPC timeout for replica replication RPC's<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    this.operationTimeout = conf.getInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT,<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  @Override<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  protected void doStart() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    try {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      connection = (ClusterConnection) ConnectionFactory.createConnection(this.conf);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      this.pool = getDefaultThreadPool(conf);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      outputSink = new RegionReplicaOutputSink(controller, tableDescriptors, entryBuffers,<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        connection, pool, numWriterThreads, operationTimeout);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      outputSink.startWriterThreads();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      super.doStart();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    } catch (IOException ex) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.warn("Received exception while creating connection :" + ex);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      notifyFailed(ex);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  protected void doStop() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    if (outputSink != null) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      try {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        outputSink.finishWritingAndClose();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      } catch (IOException ex) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        LOG.warn("Got exception while trying to close OutputSink", ex);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    if (this.pool != null) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      this.pool.shutdownNow();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      try {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        // wait for 10 sec<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        boolean shutdown = this.pool.awaitTermination(10000, TimeUnit.MILLISECONDS);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        if (!shutdown) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          LOG.warn("Failed to shutdown the thread pool after 10 seconds");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      } catch (InterruptedException e) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        LOG.warn("Got interrupted while waiting for the thread pool to shut down" + e);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      }<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    if (connection != null) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      try {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        connection.close();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      } catch (IOException ex) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        LOG.warn("Got exception closing connection :" + ex);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    super.doStop();<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>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Returns a Thread pool for the RPC's to region replicas. Similar to<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * Connection's thread pool.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   */<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private ExecutorService getDefaultThreadPool(Configuration conf) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    int maxThreads = conf.getInt("hbase.region.replica.replication.threads.max", 256);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (maxThreads == 0) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      maxThreads = Runtime.getRuntime().availableProcessors() * 8;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    long keepAliveTime = conf.getLong("hbase.region.replica.replication.threads.keepalivetime", 60);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    LinkedBlockingQueue&lt;Runnable&gt; workQueue =<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        new LinkedBlockingQueue&lt;&gt;(maxThreads *<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,<a name="line.200"></a>
-<span class="sourceLineNo">201</span>              HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS));<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ThreadPoolExecutor tpe = new ThreadPoolExecutor(<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      maxThreads,<a name="line.203"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>/**<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * A {@link org.apache.hadoop.hbase.replication.ReplicationEndpoint} endpoint<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * which receives the WAL edits from the WAL, and sends the edits to replicas<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * of regions.<a name="line.82"></a>
+<span class="sourceLineNo">083</span> */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>@InterfaceAudience.Private<a name="line.84"></a>
+<span class="sourceLineNo">085</span>public class RegionReplicaReplicationEndpoint extends HBaseReplicationEndpoint {<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final Logger LOG = LoggerFactory.getLogger(RegionReplicaReplicationEndpoint.class);<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  // Can be configured differently than hbase.client.retries.number<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private static String CLIENT_RETRIES_NUMBER<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    = "hbase.region.replica.replication.client.retries.number";<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private Configuration conf;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private ClusterConnection connection;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private TableDescriptors tableDescriptors;<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  // Reuse WALSplitter constructs as a WAL pipe<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private PipelineController controller;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  private RegionReplicaOutputSink outputSink;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private EntryBuffers entryBuffers;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  // Number of writer threads<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private int numWriterThreads;<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private int operationTimeout;<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private ExecutorService pool;<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Override<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void init(Context context) throws IOException {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    super.init(context);<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    this.conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    this.tableDescriptors = context.getTableDescriptors();<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // HRS multiplies client retries by 10 globally for meta operations, but we do not want this.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // We are resetting it here because we want default number of retries (35) rather than 10 times<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // that which makes very long retries for disabled tables etc.<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    int defaultNumRetries = conf.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    if (defaultNumRetries &gt; 10) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      int mult = conf.getInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        HConstants.DEFAULT_HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      defaultNumRetries = defaultNumRetries / mult; // reset if HRS has multiplied this already<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>    conf.setInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER, 1);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    int numRetries = conf.getInt(CLIENT_RETRIES_NUMBER, defaultNumRetries);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, numRetries);<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    this.numWriterThreads = this.conf.getInt(<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      "hbase.region.replica.replication.writer.threads", 3);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    controller = new PipelineController();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    entryBuffers = new EntryBuffers(controller,<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.conf.getInt("hbase.region.replica.replication.buffersize",<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          128*1024*1024));<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>    // use the regular RPC timeout for replica replication RPC's<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.operationTimeout = conf.getInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  protected void doStart() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      connection = (ClusterConnection) ConnectionFactory.createConnection(this.conf);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      this.pool = getDefaultThreadPool(conf);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      outputSink = new RegionReplicaOutputSink(controller, tableDescriptors, entryBuffers,<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        connection, pool, numWriterThreads, operationTimeout);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      outputSink.startWriterThreads();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      super.doStart();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    } catch (IOException ex) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      LOG.warn("Received exception while creating connection :" + ex);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      notifyFailed(ex);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  @Override<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  protected void doStop() {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    if (outputSink != null) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      try {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        outputSink.finishWritingAndClose();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      } catch (IOException ex) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        LOG.warn("Got exception while trying to close OutputSink", ex);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    if (this.pool != null) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      this.pool.shutdownNow();<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      try {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        // wait for 10 sec<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        boolean shutdown = this.pool.awaitTermination(10000, TimeUnit.MILLISECONDS);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        if (!shutdown) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          LOG.warn("Failed to shutdown the thread pool after 10 seconds");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      } catch (InterruptedException e) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        LOG.warn("Got interrupted while waiting for the thread pool to shut down" + e);<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>    if (connection != null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      try {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        connection.close();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      } catch (IOException ex) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        LOG.warn("Got exception closing connection :" + ex);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    super.doStop();<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Returns a Thread pool for the RPC's to region replicas. Similar to<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Connection's thread pool.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private ExecutorService getDefaultThreadPool(Configuration conf) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    int maxThreads = conf.getInt("hbase.region.replica.replication.threads.max", 256);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    if (maxThreads == 0) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      maxThreads = Runtime.getRuntime().availableProcessors() * 8;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    long keepAliveTime = conf.getLong("hbase.region.replica.replication.threads.keepalivetime", 60);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    LinkedBlockingQueue&lt;Runnable&gt; workQueue =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        new LinkedBlockingQueue&lt;&gt;(maxThreads *<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,<a name="line.201"></a>
+<span class="sourceLineNo">202</span>              HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS));<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ThreadPoolExecutor tpe = new ThreadPoolExecutor(<a name="line.203"></a>
 <span class="sourceLineNo">204</span>      maxThreads,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      keepAliveTime,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      TimeUnit.SECONDS,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      workQueue,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      Threads.newDaemonThreadFactory(this.getClass().getSimpleName() + "-rpc-shared-"));<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    tpe.allowCoreThreadTimeOut(true);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return tpe;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  @Override<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  public boolean replicate(ReplicateContext replicateContext) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    /* A note on batching in RegionReplicaReplicationEndpoint (RRRE):<a name="line.215"></a>
-<span class="sourceLineNo">216</span>     *<a name="line.216"></a>
-<span class="sourceLineNo">217</span>     * RRRE relies on batching from two different mechanisms. The first is the batching from<a name="line.217"></a>
-<span class="sourceLineNo">218</span>     * ReplicationSource since RRRE is a ReplicationEndpoint driven by RS. RS reads from a single<a name="line.218"></a>
-<span class="sourceLineNo">219</span>     * WAL file filling up a buffer of heap size "replication.source.size.capacity"(64MB) or at most<a name="line.219"></a>
-<span class="sourceLineNo">220</span>     * "replication.source.nb.capacity" entries or until it sees the end of file (in live tailing).<a name="line.220"></a>
-<span class="sourceLineNo">221</span>     * Then RS passes all the buffered edits in this replicate() call context. RRRE puts the edits<a name="line.221"></a>
-<span class="sourceLineNo">222</span>     * to the WALSplitter.EntryBuffers which is a blocking buffer space of up to<a name="line.222"></a>
-<span class="sourceLineNo">223</span>     * "hbase.region.replica.replication.buffersize" (128MB) in size. This buffer splits the edits<a name="line.223"></a>
-<span class="sourceLineNo">224</span>     * based on regions.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>     *<a name="line.225"></a>
-<span class="sourceLineNo">226</span>     * There are "hbase.region.replica.replication.writer.threads"(default 3) writer threads which<a name="line.226"></a>
-<span class="sourceLineNo">227</span>     * pick largest per-region buffer and send it to the SinkWriter (see RegionReplicaOutputSink).<a name="line.227"></a>
-<span class="sourceLineNo">228</span>     * The SinkWriter in this case will send the wal edits to all secondary region replicas in<a name="line.228"></a>
-<span class="sourceLineNo">229</span>     * parallel via a retrying rpc call. EntryBuffers guarantees that while a buffer is<a name="line.229"></a>
-<span class="sourceLineNo">230</span>     * being written to the sink, another buffer for the same region will not be made available to<a name="line.230"></a>
-<span class="sourceLineNo">231</span>     * writers ensuring regions edits are not replayed out of order.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>     *<a name="line.232"></a>
-<span class="sourceLineNo">233</span>     * The replicate() call won't return until all the buffers are sent and ack'd by the sinks so<a name="line.233"></a>
-<span class="sourceLineNo">234</span>     * that the replication can assume all edits are persisted. We may be able to do a better<a name="line.234"></a>
-<span class="sourceLineNo">235</span>     * pipelining between the replication thread and output sinks later if it becomes a bottleneck.<a name="line.235"></a>
-<span class="sourceLineNo">236</span>     */<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    while (this.isRunning()) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        for (Entry entry: replicateContext.getEntries()) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          entryBuffers.appendEntry(entry);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        outputSink.flush(); // make sure everything is flushed<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        ctx.getMetrics().incrLogEditsFiltered(<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          outputSink.getSkippedEditsCounter().getAndSet(0));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        return true;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      } catch (InterruptedException e) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        Thread.currentThread().interrupt();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        return false;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      } catch (IOException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        LOG.warn("Received IOException while trying to replicate"<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            + StringUtils.stringifyException(e));<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return false;<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>  @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  public boolean canReplicateToSameCluster() {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    return true;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  protected WALEntryFilter getScopeWALEntryFilter() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    // we do not care about scope. We replicate everything.<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return null;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  static class RegionReplicaOutputSink extends OutputSink {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    private final RegionReplicaSinkWriter sinkWriter;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private final TableDescriptors tableDescriptors;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final Cache&lt;TableName, Boolean&gt; memstoreReplicationEnabled;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    public RegionReplicaOutputSink(PipelineController controller, TableDescriptors tableDescriptors,<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        EntryBuffers entryBuffers, ClusterConnection connection, ExecutorService pool,<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        int numWriters, int operationTimeout) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      super(controller, entryBuffers, numWriters);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      this.sinkWriter = new RegionReplicaSinkWriter(this, connection, pool, operationTimeout);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.tableDescriptors = tableDescriptors;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>      // A cache for the table "memstore replication enabled" flag.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      // It has a default expiry of 5 sec. This means that if the table is altered<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      // with a different flag value, we might miss to replicate for that amount of<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      // time. But this cache avoid the slow lookup and parsing of the TableDescriptor.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      int memstoreReplicationEnabledCacheExpiryMs = connection.getConfiguration()<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        .getInt("hbase.region.replica.replication.cache.memstoreReplicationEnabled.expiryMs", 5000);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      this.memstoreReplicationEnabled = CacheBuilder.newBuilder()<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        .expireAfterWrite(memstoreReplicationEnabledCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        .initialCapacity(10)<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        .maximumSize(1000)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        .build();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    @Override<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    public void append(RegionEntryBuffer buffer) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      List&lt;Entry&gt; entries = buffer.getEntryBuffer();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>      if (entries.isEmpty() || entries.get(0).getEdit().getCells().isEmpty()) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        return;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>      // meta edits (e.g. flush) are always replicated.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      // data edits (e.g. put) are replicated if the table requires them.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      if (!requiresReplication(buffer.getTableName(), entries)) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        return;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      sinkWriter.append(buffer.getTableName(), buffer.getEncodedRegionName(),<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        CellUtil.cloneRow(entries.get(0).getEdit().getCells().get(0)), entries);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    @Override<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    public boolean flush() throws IOException {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      // nothing much to do for now. Wait for the Writer threads to finish up<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // append()'ing the data.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      entryBuffers.waitUntilDrained();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      return super.flush();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    @Override<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    public boolean keepRegionEvent(Entry entry) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    public List&lt;Path&gt; finishWritingAndClose() throws IOException {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      finishWriting(true);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      return null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>    @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    public Map&lt;byte[], Long&gt; getOutputCounts() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      return null; // only used in tests<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>    @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    public int getNumberOfRecoveredRegions() {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      return 0;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>    AtomicLong getSkippedEditsCounter() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      return skippedEdits;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>    /**<a name="line.346"></a>
-<span class="sourceLineNo">347</span>     * returns true if the specified entry must be replicated.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>     * We should always replicate meta operations (e.g. flush)<a name="line.348"></a>
-<span class="sourceLineNo">349</span>     * and use the user HTD flag to decide whether or not replicate the memstore.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>     */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    private boolean requiresReplication(final TableName tableName, final List&lt;Entry&gt; entries)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        throws IOException {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      // unit-tests may not the TableDescriptors, bypass the check and always replicate<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      if (tableDescriptors == null) return true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>      Boolean requiresReplication = memstoreReplicationEnabled.getIfPresent(tableName);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      if (requiresReplication == null) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        // check if the table requires memstore replication<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        // some unit-test drop the table, so we should do a bypass check and always replicate.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        TableDescriptor htd = tableDescriptors.get(tableName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        requiresReplication = htd == null || htd.hasRegionMemStoreReplication();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        memstoreReplicationEnabled.put(tableName, requiresReplication);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>      // if memstore replication is not required, check the entries.<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      // meta edits (e.g. flush) must be always replicated.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      if (!requiresReplication) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        int skipEdits = 0;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        java.util.Iterator&lt;Entry&gt; it = entries.iterator();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        while (it.hasNext()) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          Entry entry = it.next();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          if (entry.getEdit().isMetaEdit()) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>            requiresReplication = true;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>            it.remove();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            skipEdits++;<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>        skippedEdits.addAndGet(skipEdits);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      return requiresReplication;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    }<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  }<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>  static class RegionReplicaSinkWriter extends SinkWriter {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    RegionReplicaOutputSink sink;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    ClusterConnection connection;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    RpcControllerFactory rpcControllerFactory;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    RpcRetryingCallerFactory rpcRetryingCallerFactory;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    int operationTimeout;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    ExecutorService pool;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Cache&lt;TableName, Boolean&gt; disabledAndDroppedTables;<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>    public RegionReplicaSinkWriter(RegionReplicaOutputSink sink, ClusterConnection connection,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        ExecutorService pool, int operationTimeout) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      this.sink = sink;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      this.connection = connection;<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      this.operationTimeout = operationTimeout;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      this.rpcRetryingCallerFactory<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        = RpcRetryingCallerFactory.instantiate(connection.getConfiguration());<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      this.rpcControllerFactory = RpcControllerFactory.instantiate(connection.getConfiguration());<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      this.pool = pool;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>      int nonExistentTableCacheExpiryMs = connection.getConfiguration()<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        .getInt("hbase.region.replica.replication.cache.disabledAndDroppedTables.expiryMs", 5000);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      // A cache for non existing tables that have a default expiry of 5 sec. This means that if the<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      // table is created again with the same name, we might miss to replicate for that amount of<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      // time. But this cache prevents overloading meta requests for every edit from a deleted file.<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      disabledAndDroppedTables = CacheBuilder.newBuilder()<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        .expireAfterWrite(nonExistentTableCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        .initialCapacity(10)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        .maximumSize(1000)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        .build();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>    public void append(TableName tableName, byte[] encodedRegionName, byte[] row,<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        List&lt;Entry&gt; entries) throws IOException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      if (disabledAndDroppedTables.getIfPresent(tableName) != null) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        if (LOG.isTraceEnabled()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            + " is cached as a disabled or dropped table");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          for (Entry entry : entries) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            LOG.trace("Skipping : " + entry);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          }<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>      // If the table is disabled or dropped, we should not replay the entries, and we can skip<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      // replaying them. However, we might not know whether the table is disabled until we<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      // invalidate the cache and check from meta<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      RegionLocations locations = null;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      boolean useCache = true;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      while (true) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        // get the replicas of the primary region<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          locations = RegionReplicaReplayCallable<a name="line.439"></a>
-<span class="sourceLineNo">440</span>              .getRegionLocations(connection, tableName, row, useCache, 0);<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>          if (locations == null) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>            throw new HBaseIOException("Cannot locate locations for "<a name="line.443"></a>
-<span class="sourceLineNo">444</span>                + tableName + ", row:" + Bytes.toStringBinary(row));<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        } catch (TableNotFoundException e) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          if (LOG.isTraceEnabled()) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.448"></a>
-<span class="sourceLineNo">449</span>              + " is dropped. Adding table to cache.");<a name="line.449"></a>
-<span class="sourceLineNo">450</span>            for (Entry entry : entries) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              LOG.trace("Skipping : " + entry);<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>          disabledAndDroppedTables.put(tableName, Boolean.TRUE); // put to cache. Value ignored<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          // skip this entry<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.456"></a>
-<span class="sourceLineNo">457</span>          return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>        // check whether we should still replay this entry. If the regions are changed, or the<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        // entry is not coming from the primary region, filter it out.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        HRegionLocation primaryLocation = locations.getDefaultRegionLocation();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        if (!Bytes.equals(primaryLocation.getRegionInfo().getEncodedNameAsBytes(),<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          encodedRegionName)) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          if (useCache) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>            useCache = false;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>            continue; // this will retry location lookup<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>            LOG.trace("Skipping " + entries.size() + " entries in table " + tableName<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              + " because located region " + primaryLocation.getRegionInfo().getEncodedName()<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              + " is different than the original region " + Bytes.toStringBinary(encodedRegionName)<a name="line.472"></a>
-<span class="sourceLineNo">473</span>              + " from WALEdit");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            for (Entry entry : entries) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>              LOG.trace("Skipping : " + entry);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>            }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          return;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>      if (locations.size() == 1) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>        return;<a name="line.485"></a>
+<span class="sourceLineNo">205</span>      maxThreads,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      keepAliveTime,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      TimeUnit.SECONDS,<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      workQueue,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      Threads.newDaemonThreadFactory(this.getClass().getSimpleName() + "-rpc-shared-"));<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    tpe.allowCoreThreadTimeOut(true);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return tpe;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  public boolean replicate(ReplicateContext replicateContext) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    /* A note on batching in RegionReplicaReplicationEndpoint (RRRE):<a name="line.216"></a>
+<span class="sourceLineNo">217</span>     *<a name="line.217"></a>
+<span class="sourceLineNo">218</span>     * RRRE relies on batching from two different mechanisms. The first is the batching from<a name="line.218"></a>
+<span class="sourceLineNo">219</span>     * ReplicationSource since RRRE is a ReplicationEndpoint driven by RS. RS reads from a single<a name="line.219"></a>
+<span class="sourceLineNo">220</span>     * WAL file filling up a buffer of heap size "replication.source.size.capacity"(64MB) or at most<a name="line.220"></a>
+<span class="sourceLineNo">221</span>     * "replication.source.nb.capacity" entries or until it sees the end of file (in live tailing).<a name="line.221"></a>
+<span class="sourceLineNo">222</span>     * Then RS passes all the buffered edits in this replicate() call context. RRRE puts the edits<a name="line.222"></a>
+<span class="sourceLineNo">223</span>     * to the WALSplitter.EntryBuffers which is a blocking buffer space of up to<a name="line.223"></a>
+<span class="sourceLineNo">224</span>     * "hbase.region.replica.replication.buffersize" (128MB) in size. This buffer splits the edits<a name="line.224"></a>
+<span class="sourceLineNo">225</span>     * based on regions.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>     *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>     * There are "hbase.region.replica.replication.writer.threads"(default 3) writer threads which<a name="line.227"></a>
+<span class="sourceLineNo">228</span>     * pick largest per-region buffer and send it to the SinkWriter (see RegionReplicaOutputSink).<a name="line.228"></a>
+<span class="sourceLineNo">229</span>     * The SinkWriter in this case will send the wal edits to all secondary region replicas in<a name="line.229"></a>
+<span class="sourceLineNo">230</span>     * parallel via a retrying rpc call. EntryBuffers guarantees that while a buffer is<a name="line.230"></a>
+<span class="sourceLineNo">231</span>     * being written to the sink, another buffer for the same region will not be made available to<a name="line.231"></a>
+<span class="sourceLineNo">232</span>     * writers ensuring regions edits are not replayed out of order.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>     *<a name="line.233"></a>
+<span class="sourceLineNo">234</span>     * The replicate() call won't return until all the buffers are sent and ack'd by the sinks so<a name="line.234"></a>
+<span class="sourceLineNo">235</span>     * that the replication can assume all edits are persisted. We may be able to do a better<a name="line.235"></a>
+<span class="sourceLineNo">236</span>     * pipelining between the replication thread and output sinks later if it becomes a bottleneck.<a name="line.236"></a>
+<span class="sourceLineNo">237</span>     */<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    while (this.isRunning()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        for (Entry entry: replicateContext.getEntries()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          entryBuffers.appendEntry(entry);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        outputSink.flush(); // make sure everything is flushed<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        ctx.getMetrics().incrLogEditsFiltered(<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          outputSink.getSkippedEditsCounter().getAndSet(0));<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        return true;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      } catch (InterruptedException e) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        Thread.currentThread().interrupt();<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        return false;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      } catch (IOException e) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        LOG.warn("Received IOException while trying to replicate"<a name="line.252"></a>
+<span class="sourceLineNo">253</span>            + StringUtils.stringifyException(e));<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    return false;<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>  @Override<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public boolean canReplicateToSameCluster() {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    return true;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected WALEntryFilter getScopeWALEntryFilter() {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // we do not care about scope. We replicate everything.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    return null;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  static class RegionReplicaOutputSink extends OutputSink {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    private final RegionReplicaSinkWriter sinkWriter;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private final TableDescriptors tableDescriptors;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private final Cache&lt;TableName, Boolean&gt; memstoreReplicationEnabled;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    public RegionReplicaOutputSink(PipelineController controller, TableDescriptors tableDescriptors,<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        EntryBuffers entryBuffers, ClusterConnection connection, ExecutorService pool,<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        int numWriters, int operationTimeout) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      super(controller, entryBuffers, numWriters);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      this.sinkWriter =<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          new RegionReplicaSinkWriter(this, connection, pool, operationTimeout, tableDescriptors);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      this.tableDescriptors = tableDescriptors;<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>      // A cache for the table "memstore replication enabled" flag.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      // It has a default expiry of 5 sec. This means that if the table is altered<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // with a different flag value, we might miss to replicate for that amount of<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // time. But this cache avoid the slow lookup and parsing of the TableDescriptor.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      int memstoreReplicationEnabledCacheExpiryMs = connection.getConfiguration()<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        .getInt("hbase.region.replica.replication.cache.memstoreReplicationEnabled.expiryMs", 5000);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.memstoreReplicationEnabled = CacheBuilder.newBuilder()<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        .expireAfterWrite(memstoreReplicationEnabledCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        .initialCapacity(10)<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        .maximumSize(1000)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        .build();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    public void append(RegionEntryBuffer buffer) throws IOException {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      List&lt;Entry&gt; entries = buffer.getEntryBuffer();<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>      if (entries.isEmpty() || entries.get(0).getEdit().getCells().isEmpty()) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        return;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>      // meta edits (e.g. flush) are always replicated.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      // data edits (e.g. put) are replicated if the table requires them.<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      if (!requiresReplication(buffer.getTableName(), entries)) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        return;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>      sinkWriter.append(buffer.getTableName(), buffer.getEncodedRegionName(),<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        CellUtil.cloneRow(entries.get(0).getEdit().getCells().get(0)), entries);<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>    @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    public boolean flush() throws IOException {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // nothing much to do for now. Wait for the Writer threads to finish up<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // append()'ing the data.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      entryBuffers.waitUntilDrained();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      return super.flush();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>    @Override<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    public boolean keepRegionEvent(Entry entry) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      return true;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>    @Override<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    public List&lt;Path&gt; finishWritingAndClose() throws IOException {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      finishWriting(true);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      return null;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    @Override<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    public Map&lt;byte[], Long&gt; getOutputCounts() {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      return null; // only used in tests<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    public int getNumberOfRecoveredRegions() {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      return 0;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>    AtomicLong getSkippedEditsCounter() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      return skippedEdits;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>    /**<a name="line.348"></a>
+<span class="sourceLineNo">349</span>     * returns true if the specified entry must be replicated.<a name="line.349"></a>
+<span class="sourceLineNo">350</span>     * We should always replicate meta operations (e.g. flush)<a name="line.350"></a>
+<span class="sourceLineNo">351</span>     * and use the user HTD flag to decide whether or not replicate the memstore.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>     */<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    private boolean requiresReplication(final TableName tableName, final List&lt;Entry&gt; entries)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        throws IOException {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      // unit-tests may not the TableDescriptors, bypass the check and always replicate<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      if (tableDescriptors == null) return true;<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Boolean requiresReplication = memstoreReplicationEnabled.getIfPresent(tableName);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      if (requiresReplication == null) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        // check if the table requires memstore replication<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        // some unit-test drop the table, so we should do a bypass check and always replicate.<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        TableDescriptor htd = tableDescriptors.get(tableName);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        requiresReplication = htd == null || htd.hasRegionMemStoreReplication();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        memstoreReplicationEnabled.put(tableName, requiresReplication);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>      // if memstore replication is not required, check the entries.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // meta edits (e.g. flush) must be always replicated.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      if (!requiresReplication) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        int skipEdits = 0;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        java.util.Iterator&lt;Entry&gt; it = entries.iterator();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        while (it.hasNext()) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          Entry entry = it.next();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          if (entry.getEdit().isMetaEdit()) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>            requiresReplication = true;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          } else {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            it.remove();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            skipEdits++;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        }<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        skippedEdits.addAndGet(skipEdits);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      }<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      return requiresReplication;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  static class RegionReplicaSinkWriter extends SinkWriter {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    RegionReplicaOutputSink sink;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    ClusterConnection connection;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    RpcControllerFactory rpcControllerFactory;<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    RpcRetryingCallerFactory rpcRetryingCallerFactory;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    int operationTimeout;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    ExecutorService pool;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    Cache&lt;TableName, Boolean&gt; disabledAndDroppedTables;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    TableDescriptors tableDescriptors;<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    public RegionReplicaSinkWriter(RegionReplicaOutputSink sink, ClusterConnection connection,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        ExecutorService pool, int operationTimeout, TableDescriptors tableDescriptors) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      this.sink = sink;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      this.connection = connection;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      this.operationTimeout = operationTimeout;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      this.rpcRetryingCallerFactory<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        = RpcRetryingCallerFactory.instantiate(connection.getConfiguration());<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      this.rpcControllerFactory = RpcControllerFactory.instantiate(connection.getConfiguration());<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      this.pool = pool;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      this.tableDescriptors = tableDescriptors;<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      int nonExistentTableCacheExpiryMs = connection.getConfiguration()<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        .getInt("hbase.region.replica.replication.cache.disabledAndDroppedTables.expiryMs", 5000);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // A cache for non existing tables that have a default expiry of 5 sec. This means that if the<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      // table is created again with the same name, we might miss to replicate for that amount of<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      // time. But this cache prevents overloading meta requests for every edit from a deleted file.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      disabledAndDroppedTables = CacheBuilder.newBuilder()<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        .expireAfterWrite(nonExistentTableCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        .initialCapacity(10)<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        .maximumSize(1000)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        .build();<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>    public void append(TableName tableName, byte[] encodedRegionName, byte[] row,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        List&lt;Entry&gt; entries) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>      if (disabledAndDroppedTables.getIfPresent(tableName) != null) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        if (LOG.isTraceEnabled()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.425"></a>
+<span class="sourceLineNo">426</span>            + " is cached as a disabled or dropped table");<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          for (Entry entry : entries) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            LOG.trace("Skipping : " + entry);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>      // If the table is disabled or dropped, we should not replay the entries, and we can skip<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      // replaying them. However, we might not know whether the table is disabled until we<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      // invalidate the cache and check from meta<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      RegionLocations locations = null;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      boolean useCache = true;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      while (true) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        // get the replicas of the primary region<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        try {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          locations = RegionReplicaReplayCallable<a name="line.443"></a>
+<span class="sourceLineNo">444</span>              .getRegionLocations(connection, tableName, row, useCache, 0);<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>          if (locations == null) {<a name="line.446"></a>
+<span class="sour

<TRUNCATED>

[18/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class=

<TRUNCATED>

[08/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sourceLineNo">

<TRUNCATED>

[25/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>        previous = current;<a name

<TRUNCATED>

[19/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</sp

<TRUNCATED>

[28/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>    

<TRUNCATED>

[05/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html
index b341b0d..10ab3d1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html
@@ -42,473 +42,534 @@
 <span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.34"></a>
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.35"></a>
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.errorhandling.ForeignException;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.master.MasterFileSystem;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MetricsSnapshot;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifest;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.slf4j.Logger;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.slf4j.LoggerFactory;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>@InterfaceAudience.Private<a name="line.59"></a>
-<span class="sourceLineNo">060</span>public class RestoreSnapshotProcedure<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    extends AbstractStateMachineTableProcedure&lt;RestoreSnapshotState&gt; {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static final Logger LOG = LoggerFactory.getLogger(RestoreSnapshotProcedure.class);<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private TableDescriptor modifiedTableDescriptor;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private List&lt;RegionInfo&gt; regionsToRestore = null;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private List&lt;RegionInfo&gt; regionsToRemove = null;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private List&lt;RegionInfo&gt; regionsToAdd = null;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private Map&lt;String, Pair&lt;String, String&gt;&gt; parentsToChildrenPairMap = new HashMap&lt;&gt;();<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private SnapshotDescription snapshot;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private boolean restoreAcl;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  // Monitor<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  private MonitoredTask monitorStatus = null;<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private Boolean traceEnabled = null;<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  /**<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * Constructor (for failover)<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  public RestoreSnapshotProcedure() {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  public RestoreSnapshotProcedure(final MasterProcedureEnv env,<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      final TableDescriptor tableDescriptor, final SnapshotDescription snapshot)<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  throws HBaseIOException {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    this(env, tableDescriptor, snapshot, false);<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  /**<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * Constructor<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   * @param env MasterProcedureEnv<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * @param tableDescriptor the table to operate on<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param snapshot snapshot to restore from<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @throws IOException<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public RestoreSnapshotProcedure(<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      final MasterProcedureEnv env,<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      final TableDescriptor tableDescriptor,<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      final SnapshotDescription snapshot,<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      final boolean restoreAcl)<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  throws HBaseIOException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    super(env);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    // This is the new schema we are going to write out as this modification.<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this.modifiedTableDescriptor = tableDescriptor;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    preflightChecks(env, null/*Table can be online when restore is called?*/);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // Snapshot information<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    this.snapshot = snapshot;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    this.restoreAcl = restoreAcl;<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>    // Monitor<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    getMonitorStatus();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.errorhandling.ForeignException;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.favored.FavoredNodesManager;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.MasterFileSystem;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.MetricsSnapshot;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.RegionState;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifest;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RestoreSnapshotState;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>@InterfaceAudience.Private<a name="line.63"></a>
+<span class="sourceLineNo">064</span>public class RestoreSnapshotProcedure<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    extends AbstractStateMachineTableProcedure&lt;RestoreSnapshotState&gt; {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private static final Logger LOG = LoggerFactory.getLogger(RestoreSnapshotProcedure.class);<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private TableDescriptor modifiedTableDescriptor;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private List&lt;RegionInfo&gt; regionsToRestore = null;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private List&lt;RegionInfo&gt; regionsToRemove = null;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private List&lt;RegionInfo&gt; regionsToAdd = null;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private Map&lt;String, Pair&lt;String, String&gt;&gt; parentsToChildrenPairMap = new HashMap&lt;&gt;();<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private SnapshotDescription snapshot;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private boolean restoreAcl;<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  // Monitor<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private MonitoredTask monitorStatus = null;<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private Boolean traceEnabled = null;<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  /**<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * Constructor (for failover)<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  public RestoreSnapshotProcedure() {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public RestoreSnapshotProcedure(final MasterProcedureEnv env,<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      final TableDescriptor tableDescriptor, final SnapshotDescription snapshot)<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  throws HBaseIOException {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    this(env, tableDescriptor, snapshot, false);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  /**<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * Constructor<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * @param env MasterProcedureEnv<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @param tableDescriptor the table to operate on<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * @param snapshot snapshot to restore from<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * @throws IOException<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public RestoreSnapshotProcedure(<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      final MasterProcedureEnv env,<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      final TableDescriptor tableDescriptor,<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      final SnapshotDescription snapshot,<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      final boolean restoreAcl)<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  throws HBaseIOException {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    super(env);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    // This is the new schema we are going to write out as this modification.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    this.modifiedTableDescriptor = tableDescriptor;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    preflightChecks(env, null/*Table can be online when restore is called?*/);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    // Snapshot information<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    this.snapshot = snapshot;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    this.restoreAcl = restoreAcl;<a name="line.112"></a>
 <span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * Set up monitor status if it is not created.<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  private MonitoredTask getMonitorStatus() {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    if (monitorStatus == null) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      monitorStatus = TaskMonitor.get().createStatus("Restoring  snapshot '" + snapshot.getName()<a name="line.119"></a>
-<span class="sourceLineNo">120</span>        + "' to table " + getTableName());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    return monitorStatus;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  @Override<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  protected Flow executeFromState(final MasterProcedureEnv env, final RestoreSnapshotState state)<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      throws InterruptedException {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    if (isTraceEnabled()) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      LOG.trace(this + " execute state=" + state);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    }<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>    // Make sure that the monitor status is set up<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    getMonitorStatus();<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    try {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      switch (state) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        case RESTORE_SNAPSHOT_PRE_OPERATION:<a name="line.137"></a>
-<span class="sourceLineNo">138</span>          // Verify if we can restore the table<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          prepareRestore(env);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          setNextState(RestoreSnapshotState.RESTORE_SNAPSHOT_UPDATE_TABLE_DESCRIPTOR);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          break;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>        case RESTORE_SNAPSHOT_UPDATE_TABLE_DESCRIPTOR:<a name="line.142"></a>
-<span class="sourceLineNo">143</span>          updateTableDescriptor(env);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>          setNextState(RestoreSnapshotState.RESTORE_SNAPSHOT_WRITE_FS_LAYOUT);<a name="line.144"></a>
+<span class="sourceLineNo">114</span>    // Monitor<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    getMonitorStatus();<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * Set up monitor status if it is not created.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private MonitoredTask getMonitorStatus() {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    if (monitorStatus == null) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      monitorStatus = TaskMonitor.get().createStatus("Restoring  snapshot '" + snapshot.getName()<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        + "' to table " + getTableName());<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    return monitorStatus;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  @Override<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected Flow executeFromState(final MasterProcedureEnv env, final RestoreSnapshotState state)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      throws InterruptedException {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (isTraceEnabled()) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      LOG.trace(this + " execute state=" + state);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // Make sure that the monitor status is set up<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    getMonitorStatus();<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    try {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      switch (state) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        case RESTORE_SNAPSHOT_PRE_OPERATION:<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          // Verify if we can restore the table<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          prepareRestore(env);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          setNextState(RestoreSnapshotState.RESTORE_SNAPSHOT_UPDATE_TABLE_DESCRIPTOR);<a name="line.144"></a>
 <span class="sourceLineNo">145</span>          break;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        case RESTORE_SNAPSHOT_WRITE_FS_LAYOUT:<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          restoreSnapshot(env);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          setNextState(RestoreSnapshotState.RESTORE_SNAPSHOT_UPDATE_META);<a name="line.148"></a>
+<span class="sourceLineNo">146</span>        case RESTORE_SNAPSHOT_UPDATE_TABLE_DESCRIPTOR:<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          updateTableDescriptor(env);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          setNextState(RestoreSnapshotState.RESTORE_SNAPSHOT_WRITE_FS_LAYOUT);<a name="line.148"></a>
 <span class="sourceLineNo">149</span>          break;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        case RESTORE_SNAPSHOT_UPDATE_META:<a name="line.150"></a>
-<span class="sourceLineNo">151</span>          updateMETA(env);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          setNextState(RestoreSnapshotState.RESTORE_SNAPSHOT_RESTORE_ACL);<a name="line.152"></a>
+<span class="sourceLineNo">150</span>        case RESTORE_SNAPSHOT_WRITE_FS_LAYOUT:<a name="line.150"></a>
+<span class="sourceLineNo">151</span>          restoreSnapshot(env);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>          setNextState(RestoreSnapshotState.RESTORE_SNAPSHOT_UPDATE_META);<a name="line.152"></a>
 <span class="sourceLineNo">153</span>          break;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        case RESTORE_SNAPSHOT_RESTORE_ACL:<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          restoreSnapshotAcl(env);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>          return Flow.NO_MORE_STATE;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        default:<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    } catch (IOException e) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      if (isRollbackSupported(state)) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        setFailure("master-restore-snapshot", e);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      } else {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        LOG.warn("Retriable error trying to restore snapshot=" + snapshot.getName() +<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          " to table=" + getTableName() + " (in state=" + state + ")", e);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      }<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    }<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    return Flow.HAS_MORE_STATE;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Override<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  protected void rollbackState(final MasterProcedureEnv env, final RestoreSnapshotState state)<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    if (state == RestoreSnapshotState.RESTORE_SNAPSHOT_PRE_OPERATION) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      // nothing to rollback<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return;<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>    // The restore snapshot doesn't have a rollback. The execution will succeed, at some point.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">154</span>        case RESTORE_SNAPSHOT_UPDATE_META:<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          updateMETA(env);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          setNextState(RestoreSnapshotState.RESTORE_SNAPSHOT_RESTORE_ACL);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          break;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        case RESTORE_SNAPSHOT_RESTORE_ACL:<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          restoreSnapshotAcl(env);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>          return Flow.NO_MORE_STATE;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        default:<a name="line.161"></a>
+<span class="sourceLineNo">162</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      }<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    } catch (IOException e) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      if (isRollbackSupported(state)) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        setFailure("master-restore-snapshot", e);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      } else {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        LOG.warn("Retriable error trying to restore snapshot=" + snapshot.getName() +<a name="line.168"></a>
+<span class="sourceLineNo">169</span>          " to table=" + getTableName() + " (in state=" + state + ")", e);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      }<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    return Flow.HAS_MORE_STATE;<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>  @Override<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  protected void rollbackState(final MasterProcedureEnv env, final RestoreSnapshotState state)<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    if (state == RestoreSnapshotState.RESTORE_SNAPSHOT_PRE_OPERATION) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      // nothing to rollback<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      return;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
 <span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  @Override<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  protected boolean isRollbackSupported(final RestoreSnapshotState state) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    switch (state) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      case RESTORE_SNAPSHOT_PRE_OPERATION:<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        return true;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      default:<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        return false;<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><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected RestoreSnapshotState getState(final int stateId) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    return RestoreSnapshotState.valueOf(stateId);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  @Override<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  protected int getStateId(final RestoreSnapshotState state) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    return state.getNumber();<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  }<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  @Override<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  protected RestoreSnapshotState getInitialState() {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    return RestoreSnapshotState.RESTORE_SNAPSHOT_PRE_OPERATION;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  @Override<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  public TableName getTableName() {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return modifiedTableDescriptor.getTableName();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  @Override<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  public TableOperationType getTableOperationType() {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    return TableOperationType.EDIT; // Restore is modifying a table<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  @Override<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  public boolean abort(final MasterProcedureEnv env) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    // TODO: We may be able to abort if the procedure is not started yet.<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    return false;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  @Override<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    sb.append(getClass().getSimpleName());<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    sb.append(" (table=");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    sb.append(getTableName());<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    sb.append(" snapshot=");<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    sb.append(snapshot);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    sb.append(")");<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>  @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    super.serializeStateData(serializer);<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    MasterProcedureProtos.RestoreSnapshotStateData.Builder restoreSnapshotMsg =<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      MasterProcedureProtos.RestoreSnapshotStateData.newBuilder()<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        .setUserInfo(MasterProcedureUtil.toProtoUserInfo(getUser()))<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        .setSnapshot(this.snapshot)<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        .setModifiedTableSchema(ProtobufUtil.toTableSchema(modifiedTableDescriptor));<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    if (regionsToRestore != null) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      for (RegionInfo hri: regionsToRestore) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        restoreSnapshotMsg.addRegionInfoForRestore(ProtobufUtil.toRegionInfo(hri));<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (regionsToRemove != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      for (RegionInfo hri: regionsToRemove) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        restoreSnapshotMsg.addRegionInfoForRemove(ProtobufUtil.toRegionInfo(hri));<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    if (regionsToAdd != null) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      for (RegionInfo hri: regionsToAdd) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        restoreSnapshotMsg.addRegionInfoForAdd(ProtobufUtil.toRegionInfo(hri));<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>    if (!parentsToChildrenPairMap.isEmpty()) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      final Iterator&lt;Map.Entry&lt;String, Pair&lt;String, String&gt;&gt;&gt; it =<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        parentsToChildrenPairMap.entrySet().iterator();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      while (it.hasNext()) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        final Map.Entry&lt;String, Pair&lt;String, String&gt;&gt; entry = it.next();<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>        MasterProcedureProtos.RestoreParentToChildRegionsPair.Builder parentToChildrenPair =<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          MasterProcedureProtos.RestoreParentToChildRegionsPair.newBuilder()<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          .setParentRegionName(entry.getKey())<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          .setChild1RegionName(entry.getValue().getFirst())<a name="line.269"></a>
-<span class="sourceLineNo">270</span>          .setChild2RegionName(entry.getValue().getSecond());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        restoreSnapshotMsg.addParentToChildRegionsPairList (parentToChildrenPair);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    serializer.serialize(restoreSnapshotMsg.build());<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>  @Override<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      throws IOException {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    super.deserializeStateData(serializer);<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>    MasterProcedureProtos.RestoreSnapshotStateData restoreSnapshotMsg =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        serializer.deserialize(MasterProcedureProtos.RestoreSnapshotStateData.class);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    setUser(MasterProcedureUtil.toUserInfo(restoreSnapshotMsg.getUserInfo()));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    snapshot = restoreSnapshotMsg.getSnapshot();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    modifiedTableDescriptor =<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      ProtobufUtil.toTableDescriptor(restoreSnapshotMsg.getModifiedTableSchema());<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    if (restoreSnapshotMsg.getRegionInfoForRestoreCount() == 0) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      regionsToRestore = null;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    } else {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      regionsToRestore = new ArrayList&lt;&gt;(restoreSnapshotMsg.getRegionInfoForRestoreCount());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      for (HBaseProtos.RegionInfo hri: restoreSnapshotMsg.getRegionInfoForRestoreList()) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        regionsToRestore.add(ProtobufUtil.toRegionInfo(hri));<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    if (restoreSnapshotMsg.getRegionInfoForRemoveCount() == 0) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      regionsToRemove = null;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    } else {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      regionsToRemove = new ArrayList&lt;&gt;(restoreSnapshotMsg.getRegionInfoForRemoveCount());<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      for (HBaseProtos.RegionInfo hri: restoreSnapshotMsg.getRegionInfoForRemoveList()) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        regionsToRemove.add(ProtobufUtil.toRegionInfo(hri));<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (restoreSnapshotMsg.getRegionInfoForAddCount() == 0) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      regionsToAdd = null;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    } else {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      regionsToAdd = new ArrayList&lt;&gt;(restoreSnapshotMsg.getRegionInfoForAddCount());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      for (HBaseProtos.RegionInfo hri: restoreSnapshotMsg.getRegionInfoForAddList()) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        regionsToAdd.add(ProtobufUtil.toRegionInfo(hri));<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      }<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    if (restoreSnapshotMsg.getParentToChildRegionsPairListCount() &gt; 0) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      for (MasterProcedureProtos.RestoreParentToChildRegionsPair parentToChildrenPair:<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        restoreSnapshotMsg.getParentToChildRegionsPairListList()) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        parentsToChildrenPairMap.put(<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          parentToChildrenPair.getParentRegionName(),<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          new Pair&lt;&gt;(<a name="line.318"></a>
-<span class="sourceLineNo">319</span>            parentToChildrenPair.getChild1RegionName(),<a name="line.319"></a>
-<span class="sourceLineNo">320</span>            parentToChildrenPair.getChild2RegionName()));<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * Action before any real action of restoring from snapshot.<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * @param env MasterProcedureEnv<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * @throws IOException<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private void prepareRestore(final MasterProcedureEnv env) throws IOException {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    final TableName tableName = getTableName();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    // Checks whether the table exists<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    if (!MetaTableAccessor.tableExists(env.getMasterServices().getConnection(), tableName)) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      throw new TableNotFoundException(tableName);<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>    // Check whether table is disabled.<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    env.getMasterServices().checkTableModifiable(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    // Check that we have at least 1 CF<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (modifiedTableDescriptor.getColumnFamilyCount() == 0) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new DoNotRetryIOException("Table " + getTableName().toString() +<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        " should have at least one column family.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>    if (!getTableName().isSystemTable()) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // Table already exist. Check and update the region quota for this table namespace.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      final MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      SnapshotManifest manifest = SnapshotManifest.open(<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        env.getMasterConfiguration(),<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        mfs.getFileSystem(),<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshot, mfs.getRootDir()),<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        snapshot);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      int snapshotRegionCount = manifest.getRegionManifestsMap().size();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      int tableRegionCount =<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          ProcedureSyncWait.getMasterQuotaManager(env).getRegionCountOfTable(tableName);<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>      if (snapshotRegionCount &gt; 0 &amp;&amp; tableRegionCount != snapshotRegionCount) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        ProcedureSyncWait.getMasterQuotaManager(env).checkAndUpdateNamespaceRegionQuota(<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          tableName, snapshotRegionCount);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /**<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * Update descriptor<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * @param env MasterProcedureEnv<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * @throws IOException<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   **/<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private void updateTableDescriptor(final MasterProcedureEnv env) throws IOException {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    env.getMasterServices().getTableDescriptors().add(modifiedTableDescriptor);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>  /**<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * Execute the on-disk Restore<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @param env MasterProcedureEnv<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @throws IOException<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   **/<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private void restoreSnapshot(final MasterProcedureEnv env) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    MasterFileSystem fileSystemManager = env.getMasterServices().getMasterFileSystem();<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FileSystem fs = fileSystemManager.getFileSystem();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    Path rootDir = fileSystemManager.getRootDir();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final ForeignExceptionDispatcher monitorException = new ForeignExceptionDispatcher();<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    LOG.info("Starting restore snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshot, rootDir);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      SnapshotManifest manifest = SnapshotManifest.open(<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        env.getMasterServices().getConfiguration(), fs, snapshotDir, snapshot);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      RestoreSnapshotHelper restoreHelper = new RestoreSnapshotHelper(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        env.getMasterServices().getConfiguration(),<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        fs,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        manifest,<a name="line.393"></a>
-<span class="sourceLineNo">394</span>              modifiedTableDescriptor,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        rootDir,<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        monitorException,<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        getMonitorStatus());<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>      RestoreSnapshotHelper.RestoreMetaChanges metaChanges = restoreHelper.restoreHdfsRegions();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      regionsToRestore = metaChanges.getRegionsToRestore();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      regionsToRemove = metaChanges.getRegionsToRemove();<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      regionsToAdd = metaChanges.getRegionsToAdd();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      parentsToChildrenPairMap = metaChanges.getParentToChildrenPairMap();<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    } catch (IOException e) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      String msg = "restore snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        + " failed in on-disk restore. Try re-running the restore command.";<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      LOG.error(msg, e);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      monitorException.receive(<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        new ForeignException(env.getMasterServices().getServerName().toString(), e));<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      throw new IOException(msg, e);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>  /**<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * Apply changes to hbase:meta<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * @param env MasterProcedureEnv<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * @throws IOException<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   **/<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  private void updateMETA(final MasterProcedureEnv env) throws IOException {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    try {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      Connection conn = env.getMasterServices().getConnection();<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>      // 1. Prepare to restore<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      getMonitorStatus().setStatus("Preparing to restore each region");<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>      // 2. Applies changes to hbase:meta<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      // (2.1). Removes the current set of regions from META<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      //<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      // By removing also the regions to restore (the ones present both in the snapshot<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      // and in the current state) we ensure that no extra fields are present in META<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      // e.g. with a simple add addRegionToMeta() the splitA and splitB attributes<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      // not overwritten/removed, so you end up with old informations<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      // that are not correct after the restore.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      if (regionsToRemove != null) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        MetaTableAccessor.deleteRegions(conn, regionsToRemove);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      }<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      // (2.2). Add the new set of regions to META<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      //<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      // At this point the old regions are no longer present in META.<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      // and the set of regions present in the snapshot will be written to META.<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      // All the information in hbase:meta are coming from the .regioninfo of each region present<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      // in the snapshot folder.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      if (regionsToAdd != null) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        MetaTableAccessor.addRegionsToMeta(<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          conn,<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          regionsToAdd,<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          modifiedTableDescriptor.getRegionReplication());<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>      if (regionsToRestore != null) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        MetaTableAccessor.overwriteRegions(<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          conn,<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          regionsToRestore,<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          modifiedTableDescriptor.getRegionReplication());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
+<span class="sourceLineNo">183</span>    // The restore snapshot doesn't have a rollback. The execution will succeed, at some point.<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>  @Override<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  protected boolean isRollbackSupported(final RestoreSnapshotState state) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    switch (state) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      case RESTORE_SNAPSHOT_PRE_OPERATION:<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        return true;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      default:<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        return false;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  @Override<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected RestoreSnapshotState getState(final int stateId) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    return RestoreSnapshotState.valueOf(stateId);<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>  @Override<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected int getStateId(final RestoreSnapshotState state) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    return state.getNumber();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  @Override<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  protected RestoreSnapshotState getInitialState() {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return RestoreSnapshotState.RESTORE_SNAPSHOT_PRE_OPERATION;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public TableName getTableName() {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return modifiedTableDescriptor.getTableName();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>  @Override<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  public TableOperationType getTableOperationType() {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    return TableOperationType.EDIT; // Restore is modifying a table<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  @Override<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  public boolean abort(final MasterProcedureEnv env) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // TODO: We may be able to abort if the procedure is not started yet.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    return false;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>  @Override<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  public void toStringClassDetails(StringBuilder sb) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    sb.append(getClass().getSimpleName());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    sb.append(" (table=");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    sb.append(getTableName());<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    sb.append(" snapshot=");<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    sb.append(snapshot);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    sb.append(")");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>  @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      throws IOException {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super.serializeStateData(serializer);<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>    MasterProcedureProtos.RestoreSnapshotStateData.Builder restoreSnapshotMsg =<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      MasterProcedureProtos.RestoreSnapshotStateData.newBuilder()<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        .setUserInfo(MasterProcedureUtil.toProtoUserInfo(getUser()))<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        .setSnapshot(this.snapshot)<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        .setModifiedTableSchema(ProtobufUtil.toTableSchema(modifiedTableDescriptor));<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>    if (regionsToRestore != null) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      for (RegionInfo hri: regionsToRestore) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        restoreSnapshotMsg.addRegionInfoForRestore(ProtobufUtil.toRegionInfo(hri));<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      }<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (regionsToRemove != null) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      for (RegionInfo hri: regionsToRemove) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        restoreSnapshotMsg.addRegionInfoForRemove(ProtobufUtil.toRegionInfo(hri));<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>    if (regionsToAdd != null) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      for (RegionInfo hri: regionsToAdd) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        restoreSnapshotMsg.addRegionInfoForAdd(ProtobufUtil.toRegionInfo(hri));<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (!parentsToChildrenPairMap.isEmpty()) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      final Iterator&lt;Map.Entry&lt;String, Pair&lt;String, String&gt;&gt;&gt; it =<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        parentsToChildrenPairMap.entrySet().iterator();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      while (it.hasNext()) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        final Map.Entry&lt;String, Pair&lt;String, String&gt;&gt; entry = it.next();<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>        MasterProcedureProtos.RestoreParentToChildRegionsPair.Builder parentToChildrenPair =<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          MasterProcedureProtos.RestoreParentToChildRegionsPair.newBuilder()<a name="line.271"></a>
+<span class="sourceLineNo">272</span>          .setParentRegionName(entry.getKey())<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          .setChild1RegionName(entry.getValue().getFirst())<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          .setChild2RegionName(entry.getValue().getSecond());<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        restoreSnapshotMsg.addParentToChildRegionsPairList (parentToChildrenPair);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    serializer.serialize(restoreSnapshotMsg.build());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  @Override<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      throws IOException {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    super.deserializeStateData(serializer);<a name="line.284"></a>
+<span class="sourceLineNo">285</span><a name="line.285"></a>
+<span class="sourceLineNo">286</span>    MasterProcedureProtos.RestoreSnapshotStateData restoreSnapshotMsg =<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        serializer.deserialize(MasterProcedureProtos.RestoreSnapshotStateData.class);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    setUser(MasterProcedureUtil.toUserInfo(restoreSnapshotMsg.getUserInfo()));<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    snapshot = restoreSnapshotMsg.getSnapshot();<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    modifiedTableDescriptor =<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      ProtobufUtil.toTableDescriptor(restoreSnapshotMsg.getModifiedTableSchema());<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>    if (restoreSnapshotMsg.getRegionInfoForRestoreCount() == 0) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      regionsToRestore = null;<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    } else {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      regionsToRestore = new ArrayList&lt;&gt;(restoreSnapshotMsg.getRegionInfoForRestoreCount());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      for (HBaseProtos.RegionInfo hri: restoreSnapshotMsg.getRegionInfoForRestoreList()) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        regionsToRestore.add(ProtobufUtil.toRegionInfo(hri));<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>    if (restoreSnapshotMsg.getRegionInfoForRemoveCount() == 0) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      regionsToRemove = null;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    } else {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      regionsToRemove = new ArrayList&lt;&gt;(restoreSnapshotMsg.getRegionInfoForRemoveCount());<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      for (HBaseProtos.RegionInfo hri: restoreSnapshotMsg.getRegionInfoForRemoveList()) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        regionsToRemove.add(ProtobufUtil.toRegionInfo(hri));<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (restoreSnapshotMsg.getRegionInfoForAddCount() == 0) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      regionsToAdd = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    } else {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      regionsToAdd = new ArrayList&lt;&gt;(restoreSnapshotMsg.getRegionInfoForAddCount());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      for (HBaseProtos.RegionInfo hri: restoreSnapshotMsg.getRegionInfoForAddList()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        regionsToAdd.add(ProtobufUtil.toRegionInfo(hri));<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    if (restoreSnapshotMsg.getParentToChildRegionsPairListCount() &gt; 0) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      for (MasterProcedureProtos.RestoreParentToChildRegionsPair parentToChildrenPair:<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        restoreSnapshotMsg.getParentToChildRegionsPairListList()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        parentsToChildrenPairMap.put(<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          parentToChildrenPair.getParentRegionName(),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          new Pair&lt;&gt;(<a name="line.322"></a>
+<span class="sourceLineNo">323</span>            parentToChildrenPair.getChild1RegionName(),<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            parentToChildrenPair.getChild2RegionName()));<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>  /**<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * Action before any real action of restoring from snapshot.<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * @param env MasterProcedureEnv<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * @throws IOException<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private void prepareRestore(final MasterProcedureEnv env) throws IOException {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    final TableName tableName = getTableName();<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    // Checks whether the table exists<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    if (!MetaTableAccessor.tableExists(env.getMasterServices().getConnection(), tableName)) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      throw new TableNotFoundException(tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>    // Check whether table is disabled.<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    env.getMasterServices().checkTableModifiable(tableName);<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>    // Check that we have at least 1 CF<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    if (modifiedTableDescriptor.getColumnFamilyCount() == 0) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      throw new DoNotRetryIOException("Table " + getTableName().toString() +<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        " should have at least one column family.");<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>    if (!getTableName().isSystemTable()) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      // Table already exist. Check and update the region quota for this table namespace.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      final MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      SnapshotManifest manifest = SnapshotManifest.open(<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        env.getMasterConfiguration(),<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        mfs.getFileSystem(),<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshot, mfs.getRootDir()),<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        snapshot);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      int snapshotRegionCount = manifest.getRegionManifestsMap().size();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      int tableRegionCount =<a name="line.359"></a>
+<span class="sourceLineNo">360</span>          ProcedureSyncWait.getMasterQuotaManager(env).getRegionCountOfTable(tableName);<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>      if (snapshotRegionCount &gt; 0 &amp;&amp; tableRegionCount != snapshotRegionCount) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        ProcedureSyncWait.getMasterQuotaManager(env).checkAndUpdateNamespaceRegionQuota(<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          tableName, snapshotRegionCount);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    }<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>   * Update descriptor<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * @param env MasterProcedureEnv<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * @throws IOException<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   **/<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private void updateTableDescriptor(final MasterProcedureEnv env) throws IOException {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    env.getMasterServices().getTableDescriptors().add(modifiedTableDescriptor);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<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>   * Execute the on-disk Restore<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @param env MasterProcedureEnv<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * @throws IOException<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   **/<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  private void restoreSnapshot(final MasterProcedureEnv env) throws IOException {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    MasterFileSystem fileSystemManager = env.getMasterServices().getMasterFileSystem();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    FileSystem fs = fileSystemManager.getFileSystem();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    Path rootDir = fileSystemManager.getRootDir();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    final ForeignExceptionDispatcher monitorException = new ForeignExceptionDispatcher();<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    LOG.info("Starting restore snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    try {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshot, rootDir);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      SnapshotManifest manifest = SnapshotManifest.open(<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        env.getMasterServices().getConfiguration(), fs, snapshotDir, snapshot);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      RestoreSnapshotHelper restoreHelper = new RestoreSnapshotHelper(<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        env.getMasterServices().getConfiguration(),<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        fs,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        manifest,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        modifiedTableDescriptor,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        rootDir,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        monitorException,<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        getMonitorStatus());<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>      RestoreSnapshotHelper.RestoreMetaChanges metaChanges = restoreHelper.restoreHdfsRegions();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      regionsToRestore = metaChanges.getRegionsToRestore();<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      regionsToRemove = metaChanges.getRegionsToRemove();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      regionsToAdd = metaChanges.getRegionsToAdd();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      parentsToChildrenPairMap = metaChanges.getParentToChildrenPairMap();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    } catch (IOException e) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      String msg = "restore snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        + " failed in on-disk restore. Try re-running the restore command.";<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      LOG.error(msg, e);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      monitorException.receive(<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        new ForeignException(env.getMasterServices().getServerName().toString(), e));<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      throw new IOException(msg, e);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  /**<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * Apply changes to hbase:meta<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * @param env MasterProcedureEnv<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * @throws IOException<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   **/<a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private void updateMETA(final MasterProcedureEnv env) throws IOException {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    try {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      Connection conn = env.getMasterServices().getConnection();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      int regionReplication = modifiedTableDescriptor.getRegionReplication();<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>      // 1. Prepare to restore<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      getMonitorStatus().setStatus("Preparing to restore each region");<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>      // 2. Applies changes to hbase:meta and in-memory states<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      // (2.1). Removes the current set of regions from META and in-memory states<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      //<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      // By removing also the regions to restore (the ones present both in the snapshot<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      // and in the current state) we ensure that no extra fields are present in META<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      // e.g. with a simple add addRegionToMeta() the splitA and splitB attributes<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      // not overwritten/removed, so you end up with old informations<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      // that are not correct after the restore.<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      if (regionsToRemove != null) {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        MetaTableAccessor.deleteRegions(conn, regionsToRemove);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        deleteRegionsFromInMemoryStates(regionsToRemove, env, regionReplication);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>      // (2.2). Add the new set of regions to META and in-memory states<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      //<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      // At this point the old regions are no longer present in META.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      // and the set of regions present in the snapshot will be written to META.<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      // All the information in hbase:meta are coming from the .regioninfo of each region present<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      // in the snapshot folder.<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      if (regionsToAdd != null) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>        MetaTableAccessor.addRegionsToMeta(conn, regionsToAdd, regionReplication);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        addRegionsToInMemoryStates(regionsToAdd, env, regionReplication);<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>      if (regionsToRestore != null) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        MetaTableAccessor.overwriteRegions(conn, regionsToRestore, regionReplication);<a name="line.456"></a>
 <span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>      RestoreSnapshotHelper.RestoreMetaChanges metaChanges =<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        new RestoreSnapshotHelper.RestoreMetaChanges(<a name="line.459"></a>
-<span class="sourceLineNo">460</span>                modifiedTableDescriptor, parentsToChildrenPairMap);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      metaChanges.updateMetaParentRegions(conn, regionsToAdd);<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // At this point the restore is complete.<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      LOG.info("Restore snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot) +<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        " on table=" + getTableName() + " completed!");<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    } catch (IOException e) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      final ForeignExceptionDispatcher monitorException = new ForeignExceptionDispatcher();<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      String msg = "restore snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          + " failed in meta update. Try re-running the restore command.";<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      LOG.error(msg, e);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      monitorException.receive(<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        new ForeignException(env.getMasterServices().getServerName().toString(), e));<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      throw new IOException(msg, e);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>    monitorStatus.markComplete("Restore snapshot '"+ snapshot.getName() +"'!");<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    MetricsSnapshot metricsSnapshot = new MetricsSnapshot();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    metricsSnapshot.addSnapshotRestore(<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      monitorStatus.getCompletionTimestamp() - monitorStatus.getStartTime());<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  private void restoreSnapshotAcl(final MasterProcedureEnv env) throws IOException {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    if (restoreAcl &amp;&amp; snapshot.hasUsersAndPermissions() &amp;&amp; snapshot.getUsersAndPermissions() != null<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        &amp;&amp; SnapshotDescriptionUtils<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            .isSecurityAvailable(env.getMasterServices().getConfiguration())) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      // restore acl of snapshot to table.<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      RestoreSnapshotHelper.restoreSnapshotAcl(snapshot, TableName.valueOf(snapshot.getTable()),<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        env.getMasterServices().getConfiguration());<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>  /**<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * The procedure could be restarted from a different machine. If the variable is null, we need to<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * retrieve it.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * @return traceEnabled<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  private Boolean isTraceEnabled() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    if (traceEnabled == null) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      traceEnabled = LOG.isTraceEnabled();<a name="line.499"></a>
+<span class="sourceLineNo">458</span>        deleteRegionsFromInMemoryStates(regionsToRestore, env, regionReplication);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>        addRegionsToInMemoryStates(regionsToRestore, env, regionReplication);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>


<TRUNCATED>

[04/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html
index 7766509..1b983c2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html
@@ -39,7 +39,11 @@
 <span class="sourceLineNo">031</span> */<a name="line.31"></a>
 <span class="sourceLineNo">032</span>@InterfaceAudience.Private<a name="line.32"></a>
 <span class="sourceLineNo">033</span>public class ProcedureDeque extends ArrayDeque&lt;Procedure&gt; {<a name="line.33"></a>
-<span class="sourceLineNo">034</span>}<a name="line.34"></a>
+<span class="sourceLineNo">034</span>  public ProcedureDeque() {<a name="line.34"></a>
+<span class="sourceLineNo">035</span>    // Default is 16 for a list that is rarely used; elements will resize if too small.<a name="line.35"></a>
+<span class="sourceLineNo">036</span>    super(2);<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  }<a name="line.37"></a>
+<span class="sourceLineNo">038</span>}<a name="line.38"></a>
 
 
 


[22/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span c

<TRUNCATED>

[46/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
index 60d53f4..f0b1205 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static final class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.1017">RegionStates.RegionFailedOpen</a>
+<pre>public static final class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.1020">RegionStates.RegionFailedOpen</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -229,7 +229,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionNode</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1018">regionNode</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1021">regionNode</a></pre>
 </li>
 </ul>
 <a name="exception">
@@ -238,7 +238,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>exception</h4>
-<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1020">exception</a></pre>
+<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1023">exception</a></pre>
 </li>
 </ul>
 <a name="retries">
@@ -247,7 +247,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>retries</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1021">retries</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1024">retries</a></pre>
 </li>
 </ul>
 </li>
@@ -264,7 +264,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionFailedOpen</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1023">RegionFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1026">RegionFailedOpen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStateNode</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1027">getRegionStateNode</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1030">getRegionStateNode</a>()</pre>
 </li>
 </ul>
 <a name="getRegionInfo--">
@@ -290,7 +290,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1031">getRegionInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1034">getRegionInfo</a>()</pre>
 </li>
 </ul>
 <a name="incrementAndGetRetries--">
@@ -299,7 +299,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementAndGetRetries</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1035">incrementAndGetRetries</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1038">incrementAndGetRetries</a>()</pre>
 </li>
 </ul>
 <a name="getRetries--">
@@ -308,7 +308,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRetries</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1039">getRetries</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1042">getRetries</a>()</pre>
 </li>
 </ul>
 <a name="setException-java.lang.Exception-">
@@ -317,7 +317,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1043">setException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;exception)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1046">setException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;exception)</pre>
 </li>
 </ul>
 <a name="getException--">
@@ -326,7 +326,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getException</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1047">getException</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html#line.1050">getException</a>()</pre>
 </li>
 </ul>
 </li>


[47/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
index 48c3c8d..0529e65 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
@@ -1760,68 +1760,72 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                                   <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;tertiaryHost)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">FavoredNodesManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#deleteFavoredNodesForRegion-org.apache.hadoop.hbase.client.RegionInfo-">deleteFavoredNodesForRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeAssignmentHelper.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.html#generateFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">generateFavoredNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodesPromoter.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesPromoter.html#generateFavoredNodesForDaughter-java.util.List-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">generateFavoredNodesForDaughter</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;parent,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriA,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriB)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html#generateFavoredNodesForDaughter-java.util.List-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">generateFavoredNodesForDaughter</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;parent,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionA,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionB)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodesPromoter.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesPromoter.html#generateFavoredNodesForMergedRegion-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">generateFavoredNodesForMergedRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;merged,
                                    <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriA,
                                    <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriB)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html#generateFavoredNodesForMergedRegion-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">generateFavoredNodesForMergedRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;merged,
                                    <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionA,
                                    <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionB)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html#getFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">getFavoredNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodesManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#getFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">getFavoredNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodesPlan.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesPlan.html#getFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">getFavoredNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodesManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#getFavoredNodesWithDNPort-org.apache.hadoop.hbase.client.RegionInfo-">getFavoredNodesWithDNPort</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeAssignmentHelper.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.html#getSecondaryAndTertiary-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">getSecondaryAndTertiary</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                        <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;primaryRS)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodesManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#isFavoredNodeApplicable-org.apache.hadoop.hbase.client.RegionInfo-">isFavoredNodeApplicable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a></code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeAssignmentHelper.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.html#makePutFromRegionInfo-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">makePutFromRegionInfo</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;favoredNodeList)</code>
 <div class="block">Generates and returns a Put containing the region info for the catalog table and the servers</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeAssignmentHelper.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.html#multiRackCase-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-java.lang.String-">multiRackCase</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
              <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;primaryRS,
@@ -1829,7 +1833,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Place secondary and tertiary nodes in a multi rack case.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeAssignmentHelper.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.html#multiRackCaseWithRestrictions-java.util.Map-java.util.Map-java.lang.String-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.client.RegionInfo-">multiRackCaseWithRestrictions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;serverToPrimaries,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;&nbsp;secondaryAndTertiaryMap,
@@ -1837,24 +1841,24 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                              <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;primaryRS,
                              <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeLoadBalancer.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeLoadBalancer.html#randomAssignment-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">randomAssignment</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodesPlan.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesPlan.html#removeFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">removeFavoredNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>
 <div class="block">Remove a favored node assignment</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodeAssignmentHelper.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.html#singleRackCase-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-java.lang.String-">singleRackCase</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
               <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;primaryRS,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;primaryRack)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">FavoredNodesPlan.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/favored/FavoredNodesPlan.html#updateFavoredNodesMap-org.apache.hadoop.hbase.client.RegionInfo-java.util.List-">updateFavoredNodesMap</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3331,28 +3335,32 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast"><span class="typeNameLabel">RegionStateStore.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html#deleteRegions-java.util.List-">deleteRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#deleteRegions-java.util.List-">deleteRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getSnapShotOfAssignment-java.util.Collection-">getSnapShotOfAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getSnapShotOfAssignment-java.util.Collection-">getSnapShotOfAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">processAssignmentPlans</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;regions,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;retainMap,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hris,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">processAssignmentPlans</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;regions,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;retainMap,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hris,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">processAssignmentPlans</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;regions,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;retainMap,
@@ -4307,6 +4315,14 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">RestoreSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#addRegionsToInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">addRegionsToInMemoryStates</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos,
+                          <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                          int&nbsp;regionReplication)</code>
+<div class="block">Add regions to in-memory states</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#addRegionsToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">addRegionsToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
@@ -4314,19 +4330,19 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Add the specified set of regions to the hbase:meta table.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">ModifyTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.html#addRegionsToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">addRegionsToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#addTableToMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">addTableToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CloneSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.html#createFilesystemLayout-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">createFilesystemLayout</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                       <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
@@ -4334,20 +4350,20 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Create regions in file system.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#createFsLayout-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-">createFsLayout</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;newRegions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.html#createFsLayout-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-org.apache.hadoop.hbase.master.procedure.CreateTableProcedure.CreateHdfsRegions-">createFsLayout</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;newRegions,
               <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.CreateHdfsRegions.html" title="interface in org.apache.hadoop.hbase.master.procedure">CreateTableProcedure.CreateHdfsRegions</a>&nbsp;hdfsRegionHandler)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CloneSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.html#createFsLayout-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.client.TableDescriptor-java.util.List-org.apache.hadoop.hbase.master.procedure.CreateTableProcedure.CreateHdfsRegions-">createFsLayout</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
@@ -4356,14 +4372,14 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Create region layout in file system.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">CreateTableProcedure.CreateHdfsRegions.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.CreateHdfsRegions.html#createHdfsRegions-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.TableName-java.util.List-">createHdfsRegions</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                  org.apache.hadoop.fs.Path&nbsp;tableRootDir,
                  <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;newRegions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="typeNameLabel">MasterDDLOperationHelper.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterDDLOperationHelper.html#deleteColumnFamilyFromFileSystem-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-java.util.List-byte:A-boolean-">deleteColumnFamilyFromFileSystem</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                                 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -4373,19 +4389,27 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Remove the column family from the file system</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.html#deleteFromFs-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-java.util.List-boolean-">deleteFromFs</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
             <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions,
             boolean&nbsp;archive)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static void</code></td>
 <td class="colLast"><span class="typeNameLabel">DeleteTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.html#deleteFromMeta-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-org.apache.hadoop.hbase.TableName-java.util.List-">deleteFromMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">RestoreSnapshotProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html#deleteRegionsFromInMemoryStates-java.util.List-org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv-int-">deleteRegionsFromInMemoryStates</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos,
+                               <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+                               int&nbsp;regionReplication)</code>
+<div class="block">Delete regions from in-memory states</div>
+</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">ServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.html#filterDefaultMetaRegions-java.util.List-">filterDefaultMetaRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index e67b778..329f62f 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -201,8 +201,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodesManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodesManager.html b/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodesManager.html
index 5e2e06e..7a32f34 100644
--- a/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodesManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/favored/FavoredNodesManager.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":9,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":9,"i11":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":9,"i12":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -211,47 +211,51 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#deleteFavoredNodesForRegions-java.util.Collection-">deleteFavoredNodesForRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfoList)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#deleteFavoredNodesForRegion-org.apache.hadoop.hbase.client.RegionInfo-">deleteFavoredNodesForRegion</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#deleteFavoredNodesForRegions-java.util.Collection-">deleteFavoredNodesForRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfoList)</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#filterNonFNApplicableRegions-java.util.Collection-">filterNonFNApplicableRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>
 <div class="block">Filter and return regions for which favored nodes is not applicable.</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#getDataNodePort--">getDataNodePort</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#getFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">getFavoredNodes</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#getFavoredNodesWithDNPort-org.apache.hadoop.hbase.client.RegionInfo-">getFavoredNodesWithDNPort</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#getRackManager--">getRackManager</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#getRegionsOfFavoredNode-org.apache.hadoop.hbase.ServerName-">getRegionsOfFavoredNode</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#getReplicaLoad-java.util.List-">getReplicaLoad</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#initialize-org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta-">initialize</a></span>(<a href="../../../../../org/apache/hadoop/hbase/master/SnapshotOfRegionAssignmentFromMeta.html" title="class in org.apache.hadoop.hbase.master">SnapshotOfRegionAssignmentFromMeta</a>&nbsp;snapshotOfRegionAssignment)</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#isFavoredNodeApplicable-org.apache.hadoop.hbase.client.RegionInfo-">isFavoredNodeApplicable</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html#updateFavoredNodes-java.util.Map-">updateFavoredNodes</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regionFNMap)</code>&nbsp;</td>
 </tr>
@@ -474,13 +478,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html#line.247">getReplicaLoad</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 </li>
 </ul>
+<a name="deleteFavoredNodesForRegion-org.apache.hadoop.hbase.client.RegionInfo-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>deleteFavoredNodesForRegion</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html#line.272">deleteFavoredNodesForRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+</li>
+</ul>
 <a name="deleteFavoredNodesForRegions-java.util.Collection-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteFavoredNodesForRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html#line.272">deleteFavoredNodesForRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfoList)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html#line.288">deleteFavoredNodesForRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfoList)</pre>
 </li>
 </ul>
 <a name="getRegionsOfFavoredNode-org.apache.hadoop.hbase.ServerName-">
@@ -489,7 +502,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsOfFavoredNode</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html#line.291">getRegionsOfFavoredNode</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html#line.295">getRegionsOfFavoredNode</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="getRackManager--">
@@ -498,7 +511,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRackManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html#line.307">getRackManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/favored/FavoredNodesManager.html#line.311">getRackManager</a>()</pre>
 </li>
 </ul>
 </li>

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

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

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

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


[41/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html
index 7ce9548..4f64733 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html
@@ -211,7 +211,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayDeque.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ProcedureDeque</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html#line.33">ProcedureDeque</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureDeque.html#line.34">ProcedureDeque</a>()</pre>
 </li>
 </ul>
 </li>

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index 7eedc5c..feee307 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,8 +247,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
index 3d2c4e5..f344241 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.270">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.271">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.OutputSink.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.OutputSink</a></pre>
 </li>
 </ul>
@@ -269,7 +269,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>sinkWriter</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.271">sinkWriter</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.272">sinkWriter</a></pre>
 </li>
 </ul>
 <a name="tableDescriptors">
@@ -278,7 +278,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>tableDescriptors</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.272">tableDescriptors</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.273">tableDescriptors</a></pre>
 </li>
 </ul>
 <a name="memstoreReplicationEnabled">
@@ -287,7 +287,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>memstoreReplicationEnabled</h4>
-<pre>private final&nbsp;org.apache.hbase.thirdparty.com.google.common.cache.Cache&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.273">memstoreReplicationEnabled</a></pre>
+<pre>private final&nbsp;org.apache.hbase.thirdparty.com.google.common.cache.Cache&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.274">memstoreReplicationEnabled</a></pre>
 </li>
 </ul>
 </li>
@@ -304,7 +304,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaOutputSink</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.275">RegionReplicaOutputSink</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.PipelineController.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.PipelineController</a>&nbsp;controller,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.276">RegionReplicaOutputSink</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.PipelineController.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.PipelineController</a>&nbsp;controller,
                                <a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a>&nbsp;tableDescriptors,
                                <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.EntryBuffers.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.EntryBuffers</a>&nbsp;entryBuffers,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
@@ -327,7 +327,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.296">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.RegionEntryBuffer.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.RegionEntryBuffer</a>&nbsp;buffer)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.298">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.RegionEntryBuffer.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.RegionEntryBuffer</a>&nbsp;buffer)
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -345,7 +345,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>flush</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.314">flush</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.316">flush</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.OutputSink.html#flush--">WALSplitter.OutputSink</a></code></span></div>
 <div class="block">WriterThread call this function to help flush internal remaining edits in buffer before close</div>
@@ -365,7 +365,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>keepRegionEvent</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.322">keepRegionEvent</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;entry)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.324">keepRegionEvent</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;entry)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.OutputSink.html#keepRegionEvent-org.apache.hadoop.hbase.wal.WAL.Entry-">WALSplitter.OutputSink</a></code></span></div>
 <div class="block">Some WALEdit's contain only KV's for account on what happened to a region.
  Not all sinks will want to get all of those edits.</div>
@@ -383,7 +383,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>finishWritingAndClose</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.327">finishWritingAndClose</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.329">finishWritingAndClose</a>()
                                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -399,7 +399,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>getOutputCounts</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.333">getOutputCounts</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.335">getOutputCounts</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.OutputSink.html#getOutputCounts--">getOutputCounts</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.OutputSink.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.OutputSink</a></code></dd>
@@ -414,7 +414,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumberOfRecoveredRegions</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.338">getNumberOfRecoveredRegions</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.340">getNumberOfRecoveredRegions</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.OutputSink.html#getNumberOfRecoveredRegions--">getNumberOfRecoveredRegions</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.OutputSink.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.OutputSink</a></code></dd>
@@ -429,7 +429,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockList">
 <li class="blockList">
 <h4>getSkippedEditsCounter</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.342">getSkippedEditsCounter</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.344">getSkippedEditsCounter</a>()</pre>
 </li>
 </ul>
 <a name="requiresReplication-org.apache.hadoop.hbase.TableName-java.util.List-">
@@ -438,7 +438,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.Outpu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>requiresReplication</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.351">requiresReplication</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html#line.353">requiresReplication</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&nbsp;entries)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">returns true if the specified entry must be replicated.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html
index 48d0115..1e05207 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.568">RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.586">RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/client/RegionAdminServiceCallable.html" title="class in org.apache.hadoop.hbase.client">RegionAdminServiceCallable</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse&gt;</pre>
 <div class="block">Calls replay on the passed edits for the given set of entries belonging to the region. It skips
  the entry if the region boundaries have changed or the region is gone.</div>
@@ -243,7 +243,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/client/RegionAdminSer
 <ul class="blockList">
 <li class="blockList">
 <h4>entries</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.570">entries</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.588">entries</a></pre>
 </li>
 </ul>
 <a name="initialEncodedRegionName">
@@ -252,7 +252,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/client/RegionAdminSer
 <ul class="blockList">
 <li class="blockList">
 <h4>initialEncodedRegionName</h4>
-<pre>private final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.571">initialEncodedRegionName</a></pre>
+<pre>private final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.589">initialEncodedRegionName</a></pre>
 </li>
 </ul>
 <a name="skippedEntries">
@@ -261,7 +261,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/client/RegionAdminSer
 <ul class="blockListLast">
 <li class="blockList">
 <h4>skippedEntries</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.572">skippedEntries</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.590">skippedEntries</a></pre>
 </li>
 </ul>
 </li>
@@ -278,7 +278,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/client/RegionAdminSer
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaReplayCallable</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.574">RegionReplicaReplayCallable</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.592">RegionReplicaReplayCallable</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
                                    <a href="../../../../../../org/apache/hadoop/hbase/ipc/RpcControllerFactory.html" title="class in org.apache.hadoop.hbase.ipc">RpcControllerFactory</a>&nbsp;rpcControllerFactory,
                                    <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                    <a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;location,
@@ -302,7 +302,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/client/RegionAdminSer
 <ul class="blockListLast">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.585">call</a>(<a href="../../../../../../org/apache/hadoop/hbase/ipc/HBaseRpcController.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRpcController</a>&nbsp;controller)
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaReplayCallable.html#line.603">call</a>(<a href="../../../../../../org/apache/hadoop/hbase/ipc/HBaseRpcController.html" title="interface in org.apache.hadoop.hbase.ipc">HBaseRpcController</a>&nbsp;controller)
                                                                                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/client/RegionAdminServiceCallable.html#call-org.apache.hadoop.hbase.ipc.HBaseRpcController-">RegionAdminServiceCallable</a></code></span></div>
 <div class="block">Run RPC call.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html
index 7146169..85fab25 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.385">RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.387">RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkWriter.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.SinkWriter</a></pre>
 </li>
 </ul>
@@ -166,6 +166,10 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#sink">sink</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#tableDescriptors">tableDescriptors</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -181,10 +185,11 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-">RegionReplicaSinkWriter</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-org.apache.hadoop.hbase.TableDescriptors-">RegionReplicaSinkWriter</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
                        <a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool,
-                       int&nbsp;operationTimeout)</code>&nbsp;</td>
+                       int&nbsp;operationTimeout,
+                       <a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a>&nbsp;tableDescriptors)</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -236,7 +241,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.386">sink</a></pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.388">sink</a></pre>
 </li>
 </ul>
 <a name="connection">
@@ -245,7 +250,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.387">connection</a></pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.389">connection</a></pre>
 </li>
 </ul>
 <a name="rpcControllerFactory">
@@ -254,7 +259,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcControllerFactory</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/ipc/RpcControllerFactory.html" title="class in org.apache.hadoop.hbase.ipc">RpcControllerFactory</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.388">rpcControllerFactory</a></pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/ipc/RpcControllerFactory.html" title="class in org.apache.hadoop.hbase.ipc">RpcControllerFactory</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.390">rpcControllerFactory</a></pre>
 </li>
 </ul>
 <a name="rpcRetryingCallerFactory">
@@ -263,7 +268,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcRetryingCallerFactory</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.html" title="class in org.apache.hadoop.hbase.client">RpcRetryingCallerFactory</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.389">rpcRetryingCallerFactory</a></pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.html" title="class in org.apache.hadoop.hbase.client">RpcRetryingCallerFactory</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.391">rpcRetryingCallerFactory</a></pre>
 </li>
 </ul>
 <a name="operationTimeout">
@@ -272,7 +277,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <ul class="blockList">
 <li class="blockList">
 <h4>operationTimeout</h4>
-<pre>int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.390">operationTimeout</a></pre>
+<pre>int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.392">operationTimeout</a></pre>
 </li>
 </ul>
 <a name="pool">
@@ -281,16 +286,25 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <ul class="blockList">
 <li class="blockList">
 <h4>pool</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.391">pool</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.393">pool</a></pre>
 </li>
 </ul>
 <a name="disabledAndDroppedTables">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>disabledAndDroppedTables</h4>
-<pre>org.apache.hbase.thirdparty.com.google.common.cache.Cache&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.392">disabledAndDroppedTables</a></pre>
+<pre>org.apache.hbase.thirdparty.com.google.common.cache.Cache&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.394">disabledAndDroppedTables</a></pre>
+</li>
+</ul>
+<a name="tableDescriptors">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>tableDescriptors</h4>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.395">tableDescriptors</a></pre>
 </li>
 </ul>
 </li>
@@ -301,16 +315,17 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-">
+<a name="RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-org.apache.hadoop.hbase.TableDescriptors-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaSinkWriter</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.394">RegionReplicaSinkWriter</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.397">RegionReplicaSinkWriter</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
                                <a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool,
-                               int&nbsp;operationTimeout)</pre>
+                               int&nbsp;operationTimeout,
+                               <a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a>&nbsp;tableDescriptors)</pre>
 </li>
 </ul>
 </li>
@@ -327,7 +342,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.SinkW
 <ul class="blockListLast">
 <li class="blockList">
 <h4>append</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.416">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#line.420">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                    byte[]&nbsp;encodedRegionName,
                    byte[]&nbsp;row,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&gt;&nbsp;entries)

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html
index 9865829..7c3bcba 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.548">RegionReplicaReplicationEndpoint.RetryingRpcCallable</a>&lt;V&gt;
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.566">RegionReplicaReplicationEndpoint.RetryingRpcCallable</a>&lt;V&gt;
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;</pre>
 </li>
@@ -216,7 +216,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>factory</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.html" title="class in org.apache.hadoop.hbase.client">RpcRetryingCallerFactory</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.549">factory</a></pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.html" title="class in org.apache.hadoop.hbase.client">RpcRetryingCallerFactory</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.567">factory</a></pre>
 </li>
 </ul>
 <a name="callable">
@@ -225,7 +225,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockList">
 <li class="blockList">
 <h4>callable</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RetryingCallable.html" title="interface in org.apache.hadoop.hbase.client">RetryingCallable</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html" title="type parameter in RegionReplicaReplicationEndpoint.RetryingRpcCallable">V</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.550">callable</a></pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/client/RetryingCallable.html" title="interface in org.apache.hadoop.hbase.client">RetryingCallable</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html" title="type parameter in RegionReplicaReplicationEndpoint.RetryingRpcCallable">V</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.568">callable</a></pre>
 </li>
 </ul>
 <a name="timeout">
@@ -234,7 +234,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>timeout</h4>
-<pre>int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.551">timeout</a></pre>
+<pre>int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.569">timeout</a></pre>
 </li>
 </ul>
 </li>
@@ -251,7 +251,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RetryingRpcCallable</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.552">RetryingRpcCallable</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.html" title="class in org.apache.hadoop.hbase.client">RpcRetryingCallerFactory</a>&nbsp;factory,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.570">RetryingRpcCallable</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.html" title="class in org.apache.hadoop.hbase.client">RpcRetryingCallerFactory</a>&nbsp;factory,
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RetryingCallable.html" title="interface in org.apache.hadoop.hbase.client">RetryingCallable</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html" title="type parameter in RegionReplicaReplicationEndpoint.RetryingRpcCallable">V</a>&gt;&nbsp;callable,
                            int&nbsp;timeout)</pre>
 </li>
@@ -270,7 +270,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html" title="type parameter in RegionReplicaReplicationEndpoint.RetryingRpcCallable">V</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.559">call</a>()
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html" title="type parameter in RegionReplicaReplicationEndpoint.RetryingRpcCallable">V</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RetryingRpcCallable.html#line.577">call</a>()
        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>


[44/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
index 8967a31..0e9c872 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1485">StochasticLoadBalancer.CPRequestCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1484">StochasticLoadBalancer.CPRequestCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a></pre>
 <div class="block">Compute the cost of total number of coprocessor requests  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -250,7 +250,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>CP_REQUEST_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1487">CP_REQUEST_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1486">CP_REQUEST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.CPRequestCostFunction.CP_REQUEST_COST_KEY">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_CP_REQUEST_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1489">DEFAULT_CP_REQUEST_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1488">DEFAULT_CP_REQUEST_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.CPRequestCostFunction.DEFAULT_CP_REQUEST_COST">Constant Field Values</a></dd>
@@ -284,7 +284,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CPRequestCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1491">CPRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1490">CPRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1497">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html#line.1496">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html
index 5c20e64..b661a94 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.611">StochasticLoadBalancer.CandidateGenerator</a>
+<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.610">StochasticLoadBalancer.CandidateGenerator</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Generates a candidate action to be applied to the cluster for cost function search</div>
 </li>
@@ -232,7 +232,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.611">CandidateGenerator</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.610">CandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -249,7 +249,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>generate</h4>
-<pre>abstract&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.612">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>abstract&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.611">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="pickRandomRegion-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-double-">
@@ -258,7 +258,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>pickRandomRegion</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.626">pickRandomRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.625">pickRandomRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                int&nbsp;server,
                                double&nbsp;chanceOfNoSwap)</pre>
 <div class="block">From a list of regions pick a random one. Null can be returned which
@@ -282,7 +282,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>pickRandomServer</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.636">pickRandomServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.635">pickRandomServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="pickRandomRack-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
@@ -291,7 +291,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>pickRandomRack</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.644">pickRandomRack</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.643">pickRandomRack</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="pickOtherRandomServer-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-int-">
@@ -300,7 +300,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>pickOtherRandomServer</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.652">pickOtherRandomServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.651">pickOtherRandomServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                     int&nbsp;serverIndex)</pre>
 </li>
 </ul>
@@ -310,7 +310,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>pickOtherRandomRack</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.664">pickOtherRandomRack</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.663">pickOtherRandomRack</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                   int&nbsp;rackIndex)</pre>
 </li>
 </ul>
@@ -320,7 +320,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>pickRandomRegions</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.676">pickRandomRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.675">pickRandomRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                                             int&nbsp;thisServer,
                                                             int&nbsp;otherServer)</pre>
 </li>
@@ -331,7 +331,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAction</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.697">getAction</a>(int&nbsp;fromServer,
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.696">getAction</a>(int&nbsp;fromServer,
                                                     int&nbsp;fromRegion,
                                                     int&nbsp;toServer,
                                                     int&nbsp;toRegion)</pre>
@@ -343,7 +343,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRandomIterationOrder</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.717">getRandomIterationOrder</a>(int&nbsp;length)</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#line.716">getRandomIterationOrder</a>(int&nbsp;length)</pre>
 <div class="block">Returns a random iteration order of indexes of an array with size length</div>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
index d5fa294..30a2a68 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1434">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a>
+<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1433">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></pre>
 <div class="block">Class to be used for the subset of RegionLoad costs that should be treated as rates.
  We do not compare about the actual rate in requests per second but rather the rate relative
@@ -228,7 +228,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CostFromRegionLoadAsRateFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html#line.1436">CostFromRegionLoadAsRateFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html#line.1435">CostFromRegionLoadAsRateFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -245,7 +245,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionLoadCost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html#line.1441">getRegionLoadCost</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&nbsp;regionLoadList)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html#line.1440">getRegionLoadCost</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&nbsp;regionLoadList)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getRegionLoadCost-java.util.Collection-">getRegionLoadCost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
index 25fc9d3..d89e994 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1369">StochasticLoadBalancer.CostFromRegionLoadFunction</a>
+<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1368">StochasticLoadBalancer.CostFromRegionLoadFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Base class the allows writing costs functions from rolling average of some
  number from RegionLoad.</div>
@@ -250,7 +250,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterStatus</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1371">clusterStatus</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1370">clusterStatus</a></pre>
 </li>
 </ul>
 <a name="loads">
@@ -259,7 +259,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>loads</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1372">loads</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1371">loads</a></pre>
 </li>
 </ul>
 <a name="stats">
@@ -268,7 +268,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stats</h4>
-<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1373">stats</a></pre>
+<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1372">stats</a></pre>
 </li>
 </ul>
 </li>
@@ -285,7 +285,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CostFromRegionLoadFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1374">CostFromRegionLoadFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1373">CostFromRegionLoadFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -302,7 +302,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterMetrics</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1378">setClusterMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;status)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1377">setClusterMetrics</a>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>&nbsp;status)</pre>
 </li>
 </ul>
 <a name="setLoads-java.util.Map-">
@@ -311,7 +311,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>setLoads</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1382">setLoads</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt;&nbsp;l)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1381">setLoads</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&gt;&nbsp;l)</pre>
 </li>
 </ul>
 <a name="cost--">
@@ -320,7 +320,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>cost</h4>
-<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1387">cost</a>()</pre>
+<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1386">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -333,7 +333,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionLoadCost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1418">getRegionLoadCost</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&nbsp;regionLoadList)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1417">getRegionLoadCost</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&gt;&nbsp;regionLoadList)</pre>
 </li>
 </ul>
 <a name="getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">
@@ -342,7 +342,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected abstract&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1426">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected abstract&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#line.1425">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
index afa249c..1318a28 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.972">StochasticLoadBalancer.CostFunction</a>
+<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.971">StochasticLoadBalancer.CostFunction</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Base class of StochasticLoadBalancer's Cost Functions.</div>
 </li>
@@ -260,7 +260,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>multiplier</h4>
-<pre>private&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.974">multiplier</a></pre>
+<pre>private&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.973">multiplier</a></pre>
 </li>
 </ul>
 <a name="cluster">
@@ -269,7 +269,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cluster</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.976">cluster</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.975">cluster</a></pre>
 </li>
 </ul>
 </li>
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.978">CostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;c)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.977">CostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;c)</pre>
 </li>
 </ul>
 </li>
@@ -303,7 +303,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isNeeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.981">isNeeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.980">isNeeded</a>()</pre>
 </li>
 </ul>
 <a name="getMultiplier--">
@@ -312,7 +312,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMultiplier</h4>
-<pre>float&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.984">getMultiplier</a>()</pre>
+<pre>float&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.983">getMultiplier</a>()</pre>
 </li>
 </ul>
 <a name="setMultiplier-float-">
@@ -321,7 +321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setMultiplier</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.988">setMultiplier</a>(float&nbsp;m)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.987">setMultiplier</a>(float&nbsp;m)</pre>
 </li>
 </ul>
 <a name="init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
@@ -330,7 +330,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.995">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.994">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
 </li>
@@ -341,7 +341,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>postAction</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1003">postAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;action)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1002">postAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;action)</pre>
 <div class="block">Called once per cluster Action to give the cost function
  an opportunity to update it's state. postAction() is always
  called at least once before cost() is called with the cluster
@@ -354,7 +354,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionMoved</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1024">regionMoved</a>(int&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1023">regionMoved</a>(int&nbsp;region,
                            int&nbsp;oldServer,
                            int&nbsp;newServer)</pre>
 </li>
@@ -365,7 +365,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cost</h4>
-<pre>abstract&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1027">cost</a>()</pre>
+<pre>abstract&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1026">cost</a>()</pre>
 </li>
 </ul>
 <a name="costFromArray-double:A-">
@@ -374,7 +374,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>costFromArray</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1037">costFromArray</a>(double[]&nbsp;stats)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1036">costFromArray</a>(double[]&nbsp;stats)</pre>
 <div class="block">Function to compute a scaled cost using <code>org.apache.commons.math3.stat.descriptive.DescriptiveStatistics</code>.
  It assumes that this is a zero sum set of costs.  It assumes that the worst case
  possible is all of the elements in one region server and the rest having 0.</div>
@@ -392,7 +392,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSum</h4>
-<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1071">getSum</a>(double[]&nbsp;stats)</pre>
+<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1070">getSum</a>(double[]&nbsp;stats)</pre>
 </li>
 </ul>
 <a name="scale-double-double-double-">
@@ -401,7 +401,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>scale</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1087">scale</a>(double&nbsp;min,
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#line.1086">scale</a>(double&nbsp;min,
                        double&nbsp;max,
                        double&nbsp;value)</pre>
 <div class="block">Scale the value between 0 and 1.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html
index d3f29b8..55be749 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.741">StochasticLoadBalancer.LoadCandidateGenerator</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.740">StochasticLoadBalancer.LoadCandidateGenerator</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CandidateGenerator</a></pre>
 </li>
 </ul>
@@ -204,7 +204,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LoadCandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html#line.741">LoadCandidateGenerator</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html#line.740">LoadCandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -221,7 +221,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>generate</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html#line.744">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html#line.743">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#generate-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">generate</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CandidateGenerator</a></code></dd>
@@ -234,7 +234,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>pickLeastLoadedServer</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html#line.752">pickLeastLoadedServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html#line.751">pickLeastLoadedServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                   int&nbsp;thisServer)</pre>
 </li>
 </ul>
@@ -244,7 +244,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>pickMostLoadedServer</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html#line.765">pickMostLoadedServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html#line.764">pickMostLoadedServer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                  int&nbsp;thisServer)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html
index 5fdd80a..ada636f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.779">StochasticLoadBalancer.LocalityBasedCandidateGenerator</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.778">StochasticLoadBalancer.LocalityBasedCandidateGenerator</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CandidateGenerator</a></pre>
 </li>
 </ul>
@@ -232,7 +232,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>masterServices</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.781">masterServices</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.780">masterServices</a></pre>
 </li>
 </ul>
 </li>
@@ -249,7 +249,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LocalityBasedCandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.783">LocalityBasedCandidateGenerator</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.782">LocalityBasedCandidateGenerator</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>generate</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.788">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.787">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#generate-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">generate</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CandidateGenerator</a></code></dd>
@@ -279,7 +279,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>tryMoveOrSwap</h4>
-<pre>private&nbsp;org.apache.hbase.thirdparty.com.google.common.base.Optional&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.818">tryMoveOrSwap</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>private&nbsp;org.apache.hbase.thirdparty.com.google.common.base.Optional&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.817">tryMoveOrSwap</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                                                                                                    int&nbsp;fromServer,
                                                                                                                    int&nbsp;fromRegion,
                                                                                                                    int&nbsp;toServer)</pre>
@@ -293,7 +293,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>getWeightedLocality</h4>
-<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.843">getWeightedLocality</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.842">getWeightedLocality</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                    int&nbsp;region,
                                    int&nbsp;server)</pre>
 </li>
@@ -304,7 +304,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setServices</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.847">setServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCandidateGenerator.html#line.846">setServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
index f8818b9..dba6c02 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1243">StochasticLoadBalancer.LocalityBasedCostFunction</a>
+<pre>abstract static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1242">StochasticLoadBalancer.LocalityBasedCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Compute a cost of a potential cluster configuration based upon where
  <a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver"><code>HStoreFile</code></a>s are located.</div>
@@ -274,7 +274,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>type</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.LocalityType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1245">type</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.LocalityType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1244">type</a></pre>
 </li>
 </ul>
 <a name="bestLocality">
@@ -283,7 +283,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>bestLocality</h4>
-<pre>private&nbsp;double <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1247">bestLocality</a></pre>
+<pre>private&nbsp;double <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1246">bestLocality</a></pre>
 </li>
 </ul>
 <a name="locality">
@@ -292,7 +292,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>locality</h4>
-<pre>private&nbsp;double <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1248">locality</a></pre>
+<pre>private&nbsp;double <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1247">locality</a></pre>
 </li>
 </ul>
 <a name="services">
@@ -301,7 +301,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>services</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1250">services</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1249">services</a></pre>
 </li>
 </ul>
 </li>
@@ -318,7 +318,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LocalityBasedCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1252">LocalityBasedCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1251">LocalityBasedCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                           <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;srv,
                           <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.LocalityType</a>&nbsp;type,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;localityCostKey,
@@ -339,7 +339,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>regionIndexToEntityIndex</h4>
-<pre>abstract&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1268">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
+<pre>abstract&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1267">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
 <div class="block">Maps region to the current entity (server or rack) on which it is stored</div>
 </li>
 </ul>
@@ -349,7 +349,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>setServices</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1270">setServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;srvc)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1269">setServices</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;srvc)</pre>
 </li>
 </ul>
 <a name="init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">
@@ -358,7 +358,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1275">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1274">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">StochasticLoadBalancer.CostFunction</a></code></span></div>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
@@ -374,7 +374,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>regionMoved</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1297">regionMoved</a>(int&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1296">regionMoved</a>(int&nbsp;region,
                            int&nbsp;oldServer,
                            int&nbsp;newServer)</pre>
 <dl>
@@ -389,7 +389,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>cost</h4>
-<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1309">cost</a>()</pre>
+<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1308">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -402,7 +402,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>getMostLocalEntityForRegion</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1313">getMostLocalEntityForRegion</a>(int&nbsp;region)</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1312">getMostLocalEntityForRegion</a>(int&nbsp;region)</pre>
 </li>
 </ul>
 <a name="getWeightedLocality-int-int-">
@@ -411,7 +411,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getWeightedLocality</h4>
-<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1317">getWeightedLocality</a>(int&nbsp;region,
+<pre>private&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#line.1316">getWeightedLocality</a>(int&nbsp;region,
                                    int&nbsp;entity)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
index 3f22d2c..91978a1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1689">StochasticLoadBalancer.MemStoreSizeCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1688">StochasticLoadBalancer.MemStoreSizeCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a></pre>
 <div class="block">Compute the cost of total memstore size.  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -250,7 +250,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>MEMSTORE_SIZE_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1691">MEMSTORE_SIZE_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1690">MEMSTORE_SIZE_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MemStoreSizeCostFunction.MEMSTORE_SIZE_COST_KEY">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_MEMSTORE_SIZE_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1693">DEFAULT_MEMSTORE_SIZE_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1692">DEFAULT_MEMSTORE_SIZE_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MemStoreSizeCostFunction.DEFAULT_MEMSTORE_SIZE_COST">Constant Field Values</a></dd>
@@ -284,7 +284,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MemStoreSizeCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1695">MemStoreSizeCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1694">MemStoreSizeCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1701">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MemStoreSizeCostFunction.html#line.1700">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
index 0626cd5..d2a13c9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1101">StochasticLoadBalancer.MoveCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1100">StochasticLoadBalancer.MoveCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Given the starting state of the regions and a potential ending state
  compute cost based upon the number of regions that have moved.</div>
@@ -242,7 +242,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>MOVE_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1102">MOVE_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1101">MOVE_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.MOVE_COST_KEY">Constant Field Values</a></dd>
@@ -255,7 +255,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_MOVES_PERCENT_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1103">MAX_MOVES_PERCENT_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1102">MAX_MOVES_PERCENT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.MAX_MOVES_PERCENT_KEY">Constant Field Values</a></dd>
@@ -268,7 +268,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MOVE_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1105">DEFAULT_MOVE_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1104">DEFAULT_MOVE_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.DEFAULT_MOVE_COST">Constant Field Values</a></dd>
@@ -281,7 +281,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_MOVES</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1106">DEFAULT_MAX_MOVES</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1105">DEFAULT_MAX_MOVES</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.DEFAULT_MAX_MOVES">Constant Field Values</a></dd>
@@ -294,7 +294,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_MOVE_PERCENT</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1107">DEFAULT_MAX_MOVE_PERCENT</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1106">DEFAULT_MAX_MOVE_PERCENT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.MoveCostFunction.DEFAULT_MAX_MOVE_PERCENT">Constant Field Values</a></dd>
@@ -307,7 +307,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>maxMovesPercent</h4>
-<pre>private final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1109">maxMovesPercent</a></pre>
+<pre>private final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1108">maxMovesPercent</a></pre>
 </li>
 </ul>
 </li>
@@ -324,7 +324,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MoveCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1111">MoveCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1110">MoveCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -341,7 +341,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cost</h4>
-<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1122">cost</a>()</pre>
+<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.MoveCostFunction.html#line.1121">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>


[37/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
index 5f41fe7..c8158b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html
@@ -524,636 +524,639 @@
 <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><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      if (!node.getTable().equals(tableName)) break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      regions.add(node);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return regions;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      if (!node.getTable().equals(tableName)) break;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      regions.add(node.toRegionState());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return regions;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      if (!node.getTable().equals(tableName)) break;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      regions.add(node.getRegionInfo());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    return regions;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    return regionsMap.values();<a name="line.547"></a>
+<span class="sourceLineNo">519</span>  public void deleteRegions(final List&lt;RegionInfo&gt; regionInfos) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    regionInfos.forEach(this::deleteRegion);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (!node.getTable().equals(tableName)) break;<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      regions.add(node);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return regions;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (!node.getTable().equals(tableName)) break;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      regions.add(node.toRegionState());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return regions;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      if (!node.getTable().equals(tableName)) break;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      regions.add(node.getRegionInfo());<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return regions;<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      regions.add(node.toRegionState());<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return regions;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  RegionState helpers<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  // ==========================================================================<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        return node.toRegionState();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  // ============================================================================================<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  //  TODO: helpers<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  // ============================================================================================<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    // TODO<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  /**<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return getRegionsOfTable(table, false);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    synchronized (node) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      if (!include(node, false)) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      if (node.isInState(State.OPEN)) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          node.getOpenSeqNum());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      } else if (node.isInState(State.OPENING)) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      } else {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        return null;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Get the regions to be reopened when modifying a table.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * &lt;p/&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<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>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p/&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * &lt;p/&gt;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * &lt;ul&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;/ul&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @param oldLoc the previous state/location of this region<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   *         means we still need to reopen the region.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    synchronized (node) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        // in OPEN state before<a name="line.644"></a>
-<span class="sourceLineNo">645</span>        if (node.isInState(State.OPEN)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>            // normal case, the region has been reopened<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            return null;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          } else {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            // the open seq num does not change, need to reopen again<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              node.getOpenSeqNum());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        } else {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          // finished maybe, but not a problem).<a name="line.656"></a>
-<span class="sourceLineNo">657</span>          return null;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      } else {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        // in OPENING state before<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          // reopened(not finished maybe, but not a problem)<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          return null;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        } else {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>          }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          // is changed to OPEN.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   */<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   *         {@link State#SPLIT} state.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      .collect(Collectors.toList());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * weed out split and offline regions.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   */<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (LOG.isTraceEnabled()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Returns the set of regions hosted by the specified server<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * @param serverName the server we are interested in<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * @return set of RegionInfo hosted by the specified server<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    synchronized (serverInfo) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return serverInfo.getRegionInfoList();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  // ============================================================================================<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  // Split helpers<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  // the ServerStateNode by calling removeServer.<a name="line.730"></a>
+<span class="sourceLineNo">550</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return regionsMap.values();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      regions.add(node.toRegionState());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return regions;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>  // ==========================================================================<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  //  RegionState helpers<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  // ==========================================================================<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        return node.toRegionState();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    return null;<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>  //  TODO: helpers<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  // ============================================================================================<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // TODO<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return getRegionsOfTable(table, false);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    synchronized (node) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      if (!include(node, false)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        return null;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      if (node.isInState(State.OPEN)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          node.getOpenSeqNum());<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      } else if (node.isInState(State.OPENING)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        return null;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Get the regions to be reopened when modifying a table.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * &lt;p/&gt;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * &lt;p/&gt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * &lt;p/&gt;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;ul&gt;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param oldLoc the previous state/location of this region<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   *         means we still need to reopen the region.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    synchronized (node) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // in OPEN state before<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        if (node.isInState(State.OPEN)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>            // normal case, the region has been reopened<a name="line.651"></a>
+<span class="sourceLineNo">652</span>            return null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>          } else {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            // the open seq num does not change, need to reopen again<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.655"></a>
+<span class="sourceLineNo">656</span>              node.getOpenSeqNum());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        } else {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // finished maybe, but not a problem).<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          return null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      } else {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        // in OPENING state before<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          // reopened(not finished maybe, but not a problem)<a name="line.667"></a>
+<span class="sourceLineNo">668</span>          return null;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        } else {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>            return null;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          // is changed to OPEN.<a name="line.675"></a>
+<span class="sourceLineNo">676</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        }<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      }<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   */<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *         {@link State#SPLIT} state.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   */<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      .collect(Collectors.toList());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<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>   * Utility. Whether to include region in list of regions. Default is to<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * weed out split and offline regions.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   */<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    if (LOG.isTraceEnabled()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.713"></a>
+<span class="sourceLineNo">714</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<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>   * Returns the set of regions hosted by the specified server<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param serverName the server we are interested in<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return set of RegionInfo hosted by the specified server<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>    synchronized (serverInfo) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      return serverInfo.getRegionInfoList();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
 <span class="sourceLineNo">731</span>  // ============================================================================================<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    synchronized (serverNode) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      serverNode.setState(state);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @see #metaLogSplit(ServerName)<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    setServerState(serverName, ServerState.SPLITTING_META);<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>  /**<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * @see #metaLogSplitting(ServerName)<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public void metaLogSplit(ServerName serverName) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   * Call this when we start log splitting for a crashed Server.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @see #logSplit(ServerName)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  public void logSplitting(final ServerName serverName) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    setServerState(serverName, ServerState.SPLITTING);<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>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Called after we've split all logs on a crashed Server.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * @see #logSplitting(ServerName)<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  public void logSplit(final ServerName serverName) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    synchronized (regionNode) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      regionNode.setState(state);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  // ============================================================================================<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  //  TODO:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  // ============================================================================================<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      if (!node.isInTransition()) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        result.add(node.getRegionInfo());<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    return result;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (region != null) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      synchronized (region) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        return region.isInState(state);<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>    return false;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    for (RegionInfo hri: regions) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      if (node == null) continue;<a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>      // TODO: State.OPEN<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      final ServerName serverName = node.getRegionLocation();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (serverName == null) continue;<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      if (serverRegions == null) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        result.put(serverName, serverRegions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      serverRegions.add(node.getRegionInfo());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    }<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return result;<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>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return assignments;<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>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    final State[] states = State.values();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<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>    for (RegionStateNode node: regionsMap.values()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      if (node.getTable().equals(tableName)) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    return tableRegions;<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>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (region != null) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      synchronized (region) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        ServerName server = region.getRegionLocation();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        return server != null ? server : region.getLastHost();<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>    return null;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Can't let out original since it can change and at least the load balancer<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return A clone of current assignments by table.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      final boolean forceByCluster) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<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>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt;(1);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return result;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      if (tableResult == null) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        tableResult = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        result.put(node.getTable(), tableResult);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      final ServerName serverName = node.getRegionLocation();<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      if (serverName == null) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.info("Skipping, no server for " + node);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        continue;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      List&lt;RegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      if (serverResult == null) {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        serverResult = new ArrayList&lt;RegionInfo&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        tableResult.put(serverName, serverResult);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      serverResult.add(node.getRegionInfo());<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add online servers with no assignment for the table.<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; table: result.values()) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        for (ServerName svr : serverMap.keySet()) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          if (!table.containsKey(svr)) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>            table.put(svr, new ArrayList&lt;RegionInfo&gt;());<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          }<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>    return result;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  // ==========================================================================<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  //  Region in transition helpers<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  // ==========================================================================<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      final RegionTransitionProcedure procedure) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return true;<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>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      final RegionTransitionProcedure procedure) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    regionNode.unsetProcedure(procedure);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>  public boolean hasRegionsInTransition() {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    return !regionInTransition.isEmpty();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>  public boolean isRegionInTransition(final RegionInfo regionInfo) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return node != null ? node.isInTransition() : false;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   */<a name="line.957"></a>
-<span class="sourceLineNo">958</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final RegionInfo hri) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (node == null) return null;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    return node.getProcedure();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
-<span class="sourceLineNo">963</span><a name="line.963"></a>
-<span class="sourceLineNo">964</span>  public RegionState getRegionTransitionState(final RegionInfo hri) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    if (node == null) return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>    synchronized (node) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      return node.isInTransition() ? node.toRegionState() : null;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>  /**<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * Get the number of regions in transition.<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  public int getRegionsInTransitionCount() {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    return regionInTransition.size();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>  }<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      rit.add(node.toRegionState());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    return rit;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      rit.add(node.toRegionState());<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return rit;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  //  Region offline helpers<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  // TODO: Unused.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public void removeFromOfflineRegions(final RegionInfo regionInfo) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    regionOffline.remove(regionInfo);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span><a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>  // ==========================================================================<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  //  Region FAIL_OPEN helpers<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  // ==========================================================================<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  public static final class RegionFailedOpen {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private final RegionStateNode regionNode;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    private volatile Exception exception = null;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    private AtomicInteger retries = new AtomicInteger();<a name="line.1021"></a>
+<span class="sourceLineNo">732</span>  // Split helpers<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  // the ServerStateNode by calling removeServer.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>  // ============================================================================================<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    synchronized (serverNode) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      serverNode.setState(state);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @see #metaLogSplit(ServerName)<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   */<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    setServerState(serverName, ServerState.SPLITTING_META);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @see #metaLogSplitting(ServerName)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public void metaLogSplit(ServerName serverName) {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * Call this when we start log splitting for a crashed Server.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @see #logSplit(ServerName)<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public void logSplitting(final ServerName serverName) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    setServerState(serverName, ServerState.SPLITTING);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  /**<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * Called after we've split all logs on a crashed Server.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * @see #logSplitting(ServerName)<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  public void logSplit(final ServerName serverName) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    synchronized (regionNode) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      regionNode.setState(state);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    }<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>  // ============================================================================================<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  //  TODO:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  // ============================================================================================<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      if (!node.isInTransition()) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        result.add(node.getRegionInfo());<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    return result;<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    if (region != null) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      synchronized (region) {<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        return region.isInState(state);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return false;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return isRegionInState(regionInfo, State.OPEN);<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionInfo hri: regions) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (node == null) continue;<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      // TODO: State.OPEN<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      final ServerName serverName = node.getRegionLocation();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      if (serverName == null) continue;<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (serverRegions == null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        result.put(serverName, serverRegions);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      serverRegions.add(node.getRegionInfo());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    return result;<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    return assignments;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    final State[] states = State.values();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      if (node.getTable().equals(tableName)) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<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>    return tableRegions;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    if (region != null) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      synchronized (region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        ServerName server = region.getRegionLocation();<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        return server != null ? server : region.getLastHost();<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      }<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    return null;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * Can't let out original since it can change and at least the load balancer<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * @return A clone of current assignments by table.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      final boolean forceByCluster) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    final Map&lt;TableName, Map&lt;Serv

<TRUNCATED>

[45/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html
index aa9649d..4b73973 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/RegionStates.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":9,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":9,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -294,241 +294,245 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#deleteRegion-org.apache.hadoop.hbase.client.RegionInfo-">deleteRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
 <tr id="i9" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#deleteRegions-java.util.List-">deleteRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos)</code>&nbsp;</td>
+</tr>
+<tr id="i10" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getAssignedRegions--">getAssignedRegions</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getAssignmentsByTable--">getAssignmentsByTable</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getAssignmentsByTable-boolean-">getAssignmentsByTable</a></span>(boolean&nbsp;forceByCluster)</code>
 <div class="block">This is an EXPENSIVE clone.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>double</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getAverageLoad--">getAverageLoad</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionFailedOpen.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionFailedOpen</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getFailedOpen-org.apache.hadoop.hbase.client.RegionInfo-">getFailedOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getOrCreateRegionStateNode-org.apache.hadoop.hbase.client.RegionInfo-">getOrCreateRegionStateNode</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getOrCreateServer-org.apache.hadoop.hbase.ServerName-">getOrCreateServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">Be judicious calling this method.</div>
 </td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionAssignments--">getRegionAssignments</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionByStateOfTable-org.apache.hadoop.hbase.TableName-">getRegionByStateOfTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionFailedOpen--">getRegionFailedOpen</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionServerOfRegion-org.apache.hadoop.hbase.client.RegionInfo-">getRegionServerOfRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsInTransition--">getRegionsInTransition</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsInTransitionCount--">getRegionsInTransitionCount</a></span>()</code>
 <div class="block">Get the number of regions in transition.</div>
 </td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsInTransitionOrderedByTimestamp--">getRegionsInTransitionOrderedByTimestamp</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsOfTable-org.apache.hadoop.hbase.TableName-">getRegionsOfTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</code>&nbsp;</td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsOfTable-org.apache.hadoop.hbase.TableName-boolean-">getRegionsOfTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                  boolean&nbsp;offline)</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsOfTable-org.apache.hadoop.hbase.TableName-java.util.function.Predicate-">getRegionsOfTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;filter)</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsOfTableForReopen-org.apache.hadoop.hbase.TableName-">getRegionsOfTableForReopen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Get the regions to be reopened when modifying a table.</div>
 </td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsStateInTransition--">getRegionsStateInTransition</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionState-org.apache.hadoop.hbase.client.RegionInfo-">getRegionState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionState-java.lang.String-">getRegionState</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName)</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionStateNode-org.apache.hadoop.hbase.client.RegionInfo-">getRegionStateNode</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionStateNodeFromName-byte:A-">getRegionStateNodeFromName</a></span>(byte[]&nbsp;regionName)</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionStateNodes--">getRegionStateNodes</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionStates--">getRegionStates</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionTransitionProcedure-org.apache.hadoop.hbase.client.RegionInfo-">getRegionTransitionProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionTransitionState-org.apache.hadoop.hbase.client.RegionInfo-">getRegionTransitionState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getServerNode-org.apache.hadoop.hbase.ServerName-">getServerNode</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getServerRegionInfoSet-org.apache.hadoop.hbase.ServerName-">getServerRegionInfoSet</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">Returns the set of regions hosted by the specified server</div>
 </td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getSnapShotOfAssignment-java.util.Collection-">getSnapShotOfAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getTableRegionsInfo-org.apache.hadoop.hbase.TableName-">getTableRegionsInfo</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getTableRegionStateNodes-org.apache.hadoop.hbase.TableName-">getTableRegionStateNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getTableRegionStates-org.apache.hadoop.hbase.TableName-">getTableRegionStates</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#hasRegionsInTransition--">hasRegionsInTransition</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#hasTableRegionStates-org.apache.hadoop.hbase.TableName-">hasTableRegionStates</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#include-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-boolean-">include</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node,
        boolean&nbsp;offline)</code>
 <div class="block">Utility.</div>
 </td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInRegionStates-org.apache.hadoop.hbase.client.RegionInfo-">isRegionInRegionStates</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</code>&nbsp;</td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInState-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.master.RegionState.State...-">isRegionInState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>...&nbsp;state)</code>&nbsp;</td>
 </tr>
-<tr id="i47" class="rowColor">
+<tr id="i48" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionInTransition-org.apache.hadoop.hbase.client.RegionInfo-">isRegionInTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i48" class="altColor">
+<tr id="i49" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionOffline-org.apache.hadoop.hbase.client.RegionInfo-">isRegionOffline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i49" class="rowColor">
+<tr id="i50" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#isRegionOnline-org.apache.hadoop.hbase.client.RegionInfo-">isRegionOnline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i50" class="altColor">
+<tr id="i51" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#logSplit-org.apache.hadoop.hbase.ServerName-">logSplit</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">Called after we've split all logs on a crashed Server.</div>
 </td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i52" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#logSplitting-org.apache.hadoop.hbase.ServerName-">logSplitting</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">Call this when we start log splitting for a crashed Server.</div>
 </td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#metaLogSplit-org.apache.hadoop.hbase.ServerName-">metaLogSplit</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">Called after we've split the meta logs on a crashed Server.</div>
 </td>
 </tr>
-<tr id="i53" class="rowColor">
+<tr id="i54" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#metaLogSplitting-org.apache.hadoop.hbase.ServerName-">metaLogSplitting</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">Call this when we start meta log splitting a crashed Server.</div>
 </td>
 </tr>
-<tr id="i54" class="altColor">
+<tr id="i55" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#regionNamesToString-java.util.Collection-">regionNamesToString</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr id="i55" class="rowColor">
+<tr id="i56" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeFromFailedOpen-org.apache.hadoop.hbase.client.RegionInfo-">removeFromFailedOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i56" class="altColor">
+<tr id="i57" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeFromOfflineRegions-org.apache.hadoop.hbase.client.RegionInfo-">removeFromOfflineRegions</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i57" class="rowColor">
+<tr id="i58" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerStateNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeRegionFromServer-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-">removeRegionFromServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                       <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i58" class="altColor">
+<tr id="i59" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeRegionInTransition-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-org.apache.hadoop.hbase.master.assignment.RegionTransitionProcedure-">removeRegionInTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
                         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;procedure)</code>&nbsp;</td>
 </tr>
-<tr id="i59" class="rowColor">
+<tr id="i60" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#removeServer-org.apache.hadoop.hbase.ServerName-">removeServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i60" class="altColor">
+<tr id="i61" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#setServerState-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.master.assignment.RegionStates.ServerState-">setServerState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
               <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerState</a>&nbsp;state)</code>&nbsp;</td>
 </tr>
-<tr id="i61" class="rowColor">
+<tr id="i62" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#updateRegionState-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.master.RegionState.State-">updateRegionState</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                  <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state)</code>&nbsp;</td>
@@ -727,13 +731,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.504">deleteRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
+<a name="deleteRegions-java.util.List-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>deleteRegions</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.519">deleteRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos)</pre>
+</li>
+</ul>
 <a name="getTableRegionStateNodes-org.apache.hadoop.hbase.TableName-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionStateNodes</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.519">getTableRegionStateNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.523">getTableRegionStateNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getTableRegionStates-org.apache.hadoop.hbase.TableName-">
@@ -742,7 +755,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionStates</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.528">getTableRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.532">getTableRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getTableRegionsInfo-org.apache.hadoop.hbase.TableName-">
@@ -751,7 +764,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionsInfo</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.537">getTableRegionsInfo</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.541">getTableRegionsInfo</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getRegionStateNodes--">
@@ -760,7 +773,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStateNodes</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.546">getRegionStateNodes</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.550">getRegionStateNodes</a>()</pre>
 </li>
 </ul>
 <a name="getRegionStates--">
@@ -769,7 +782,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStates</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.550">getRegionStates</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.554">getRegionStates</a>()</pre>
 </li>
 </ul>
 <a name="getRegionState-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -778,7 +791,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionState</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.561">getRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.565">getRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getRegionState-java.lang.String-">
@@ -787,7 +800,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionState</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.566">getRegionState</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.html" title="class in org.apache.hadoop.hbase.master">RegionState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.570">getRegionState</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName)</pre>
 </li>
 </ul>
 <a name="hasTableRegionStates-org.apache.hadoop.hbase.TableName-">
@@ -796,7 +809,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasTableRegionStates</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.579">hasTableRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.583">hasTableRegionStates</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getRegionsOfTable-org.apache.hadoop.hbase.TableName-">
@@ -805,7 +818,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsOfTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.587">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.591">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return online regions of table; does not include OFFLINE or SPLITTING regions.</dd>
@@ -818,7 +831,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionForReopen</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.591">createRegionForReopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node)</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.595">createRegionForReopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node)</pre>
 </li>
 </ul>
 <a name="getRegionsOfTableForReopen-org.apache.hadoop.hbase.TableName-">
@@ -827,7 +840,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsOfTableForReopen</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.614">getRegionsOfTableForReopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.618">getRegionsOfTableForReopen</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block">Get the regions to be reopened when modifying a table.
  <p/>
  Notice that the <code>openSeqNum</code> in the returned HRegionLocation is also used to indicate the
@@ -841,7 +854,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkReopened</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.640">checkReopened</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;oldLoc)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.644">checkReopened</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;oldLoc)</pre>
 <div class="block">Check whether the region has been reopened. The meaning of the <a href="../../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase"><code>HRegionLocation</code></a> is the
  same with <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsOfTableForReopen-org.apache.hadoop.hbase.TableName-"><code>getRegionsOfTableForReopen(TableName)</code></a>.
  <p/>
@@ -874,7 +887,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsOfTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.682">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.686">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                                           boolean&nbsp;offline)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -888,7 +901,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsOfTable</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.691">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.695">getRegionsOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&gt;&nbsp;filter)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -904,7 +917,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>include</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.702">include</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node,
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.706">include</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;node,
                 boolean&nbsp;offline)</pre>
 <div class="block">Utility. Whether to include region in list of regions. Default is to
  weed out split and offline regions.</div>
@@ -921,7 +934,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerRegionInfoSet</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.718">getServerRegionInfoSet</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.722">getServerRegionInfoSet</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Returns the set of regions hosted by the specified server</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -937,7 +950,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setServerState</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.733">setServerState</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.737">setServerState</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                             <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment">RegionStates.ServerState</a>&nbsp;state)</pre>
 </li>
 </ul>
@@ -947,7 +960,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>metaLogSplitting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.744">metaLogSplitting</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.748">metaLogSplitting</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Call this when we start meta log splitting a crashed Server.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -961,7 +974,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>metaLogSplit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.752">metaLogSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.756">metaLogSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Called after we've split the meta logs on a crashed Server.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -975,7 +988,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>logSplitting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.760">logSplitting</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.764">logSplitting</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Call this when we start log splitting for a crashed Server.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -989,7 +1002,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>logSplit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.768">logSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.772">logSplit</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 <div class="block">Called after we've split all logs on a crashed Server.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -1003,7 +1016,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRegionState</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.773">updateRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.776">updateRegionState</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                               <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state)</pre>
 </li>
 </ul>
@@ -1013,7 +1026,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignedRegions</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.783">getAssignedRegions</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.786">getAssignedRegions</a>()</pre>
 </li>
 </ul>
 <a name="isRegionInState-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.master.RegionState.State...-">
@@ -1022,7 +1035,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionInState</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.793">isRegionInState</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.796">isRegionInState</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>...&nbsp;state)</pre>
 </li>
 </ul>
@@ -1032,7 +1045,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionOnline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.803">isRegionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.806">isRegionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="isRegionOffline-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -1041,7 +1054,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionOffline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.810">isRegionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.813">isRegionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if region is offline (In OFFLINE or CLOSED state).</dd>
@@ -1054,7 +1067,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapShotOfAssignment</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.814">getSnapShotOfAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionI
 nfo</a>&gt;&nbsp;regions)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.817">getSnapShotOfAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionI
 nfo</a>&gt;&nbsp;regions)</pre>
 </li>
 </ul>
 <a name="getRegionAssignments--">
@@ -1063,7 +1076,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionAssignments</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.836">getRegionAssignments</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.839">getRegionAssignments</a>()</pre>
 </li>
 </ul>
 <a name="getRegionByStateOfTable-org.apache.hadoop.hbase.TableName-">
@@ -1072,7 +1085,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionByStateOfTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.844">getRegionByStateOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.847">getRegionByStateOfTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="getRegionServerOfRegion-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -1081,7 +1094,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServerOfRegion</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.860">getRegionServerOfRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.863">getRegionServerOfRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getAssignmentsByTable-boolean-">
@@ -1090,7 +1103,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignmentsByTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.879">getAssignmentsByTable</a>(boolean&nbsp;forceByClus
 ter)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.882">getAssignmentsByTable</a>(boolean&nbsp;forceByClus
 ter)</pre>
 <div class="block">This is an EXPENSIVE clone.  Cloning though is the safest thing to do.
  Can't let out original since it can change and at least the load balancer
  wants to iterate this exported list.  We need to synchronize on regions
@@ -1109,7 +1122,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignmentsByTable</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.896">getAssignmentsByTable</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.899">getAssignmentsByTable</a>()</pre>
 </li>
 </ul>
 <a name="addRegionInTransition-org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode-org.apache.hadoop.hbase.master.assignment.RegionTransitionProcedure-">
@@ -1118,7 +1131,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionInTransition</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.932">addRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.935">addRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
                                         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;procedure)</pre>
 </li>
 </ul>
@@ -1128,7 +1141,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>removeRegionInTransition</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.940">removeRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.943">removeRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates.RegionStateNode</a>&nbsp;regionNode,
                                         <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;procedure)</pre>
 </li>
 </ul>
@@ -1138,7 +1151,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasRegionsInTransition</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.946">hasRegionsInTransition</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.949">hasRegionsInTransition</a>()</pre>
 </li>
 </ul>
 <a name="isRegionInTransition-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -1147,7 +1160,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionInTransition</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.950">isRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.953">isRegionInTransition</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 </li>
 </ul>
 <a name="getRegionTransitionProcedure-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -1156,7 +1169,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionTransitionProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionTransitionProcedure</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html#line.958">getRegionTransitionProcedure</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.html" title="cla

<TRUNCATED>

[29/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CPRequestCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sourceLineNo">

<TRUNCATED>

[49/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 0072320..8e84ec6 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180720" />
+    <meta name="Date-Revision-yyyymmdd" content="20180722" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -284,7 +284,7 @@
 <td>3690</td>
 <td>0</td>
 <td>0</td>
-<td>15669</td></tr></table></div>
+<td>15670</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -677,7 +677,7 @@
 <td><a href="#org.apache.hadoop.hbase.ServerName.java">org/apache/hadoop/hbase/ServerName.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>24</td></tr>
+<td>25</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.SplitLogCounters.java">org/apache/hadoop/hbase/SplitLogCounters.java</a></td>
 <td>0</td>
@@ -9893,7 +9893,7 @@
 <li>sortStaticImportsAlphabetically: <tt>&quot;true&quot;</tt></li>
 <li>groups: <tt>&quot;*,org.apache.hbase.thirdparty,org.apache.hadoop.hbase.shaded&quot;</tt></li>
 <li>option: <tt>&quot;top&quot;</tt></li></ul></td>
-<td>1162</td>
+<td>1163</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -12732,385 +12732,385 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2437</td></tr>
+<td>2447</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2438</td></tr>
+<td>2448</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2641</td></tr>
+<td>2657</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>2679</td></tr>
+<td>2695</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2710</td></tr>
+<td>2726</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2712</td></tr>
+<td>2728</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2713</td></tr>
+<td>2729</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2714</td></tr>
+<td>2730</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>2725</td></tr>
+<td>2741</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2766</td></tr>
+<td>2782</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2787</td></tr>
+<td>2803</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2842</td></tr>
+<td>2858</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2874</td></tr>
+<td>2890</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>2901</td></tr>
+<td>2917</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2922</td></tr>
+<td>2938</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2923</td></tr>
+<td>2939</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2939</td></tr>
+<td>2955</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2940</td></tr>
+<td>2956</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2943</td></tr>
+<td>2959</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2994</td></tr>
+<td>3010</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2997</td></tr>
+<td>3013</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3014</td></tr>
+<td>3030</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3015</td></tr>
+<td>3031</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3016</td></tr>
+<td>3032</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3029</td></tr>
+<td>3045</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3030</td></tr>
+<td>3046</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3033</td></tr>
+<td>3049</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3038</td></tr>
+<td>3054</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3046</td></tr>
+<td>3062</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3047</td></tr>
+<td>3063</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3063</td></tr>
+<td>3079</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3064</td></tr>
+<td>3080</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3076</td></tr>
+<td>3092</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3097</td></tr>
+<td>3113</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3129</td></tr>
+<td>3145</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3133</td></tr>
+<td>3149</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3185</td></tr>
+<td>3201</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3186</td></tr>
+<td>3202</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3187</td></tr>
+<td>3203</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3188</td></tr>
+<td>3204</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3189</td></tr>
+<td>3205</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3215</td></tr>
+<td>3231</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3231</td></tr>
+<td>3247</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3232</td></tr>
+<td>3248</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3258</td></tr>
+<td>3274</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3267</td></tr>
+<td>3283</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3281</td></tr>
+<td>3297</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>3301</td></tr>
+<td>3317</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>3332</td></tr>
+<td>3348</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3391</td></tr>
+<td>3407</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3392</td></tr>
+<td>3408</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3394</td></tr>
+<td>3410</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rparen' has incorrect indentation level 48, expected level should be 2.</td>
-<td>3412</td></tr>
+<td>3428</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>3430</td></tr>
+<td>3446</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>3721</td></tr>
+<td>3737</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3808</td></tr>
+<td>3824</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3810</td></tr>
+<td>3826</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3844</td></tr>
+<td>3860</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3881</td></tr>
+<td>3897</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3883</td></tr>
+<td>3899</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3961</td></tr>
+<td>3977</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3969</td></tr>
+<td>3985</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3977</td></tr>
+<td>3993</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3978</td></tr></table></div>
+<td>3994</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HColumnDescriptor.java">org/apache/hadoop/hbase/HColumnDescriptor.java</h3>
 <table border="0" class="table table-striped">
@@ -17829,158 +17829,164 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
+<td>33</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>124</td></tr>
-<tr class="b">
+<td>133</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>131</td></tr>
-<tr class="a">
+<td>140</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>133</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>207</td></tr>
+<td>142</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>208</td></tr>
+<td>216</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>209</td></tr>
+<td>217</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>219</td></tr>
+<td>218</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>250</td></tr>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>228</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>251</td></tr>
+<td>259</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>252</td></tr>
+<td>260</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>261</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>254</td></tr>
-<tr class="b">
+<td>263</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>271</td></tr>
-<tr class="a">
+<td>280</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>273</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>280</td></tr>
+<td>282</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>360</td></tr>
+<td>289</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>361</td></tr>
+<td>369</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>362</td></tr>
+<td>370</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>371</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>367</td></tr>
-<tr class="a">
+<td>376</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>368</td></tr>
-<tr class="b">
+<td>377</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>374</td></tr>
-<tr class="a">
+<td>383</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>375</td></tr>
-<tr class="b">
+<td>384</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>402</td></tr>
-<tr class="a">
+<td>411</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>413</td></tr>
-<tr class="b">
+<td>422</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>416</td></tr></table></div>
+<td>425</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.SplitLogCounters.java">org/apache/hadoop/hbase/SplitLogCounters.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -17989,31 +17995,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.SplitLogTask.java">org/apache/hadoop/hbase/SplitLogTask.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18022,25 +18028,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.StripeCompactionsPerformanceEvaluation.java">org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18049,79 +18055,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableDescriptors.java">org/apache/hadoop/hbase/TableDescriptors.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.TableDescriptor' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>66</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18130,43 +18136,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableInfoMissingException.java">org/apache/hadoop/hbase/TableInfoMissingException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -18175,109 +18181,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableName.java">org/apache/hadoop/hbase/TableName.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>428</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>429</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>457</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>510</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>511</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18286,13 +18292,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotDisabledException.java">org/apache/hadoop/hbase/TableNotDisabledException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18301,13 +18307,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotEnabledException.java">org/apache/hadoop/hbase/TableNotEnabledException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18316,13 +18322,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotFoundException.java">org/apache/hadoop/hbase/TableNotFoundException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18331,13 +18337,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TagType.java">org/apache/hadoop/hbase/TagType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -18346,13 +18352,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestCellUtil.java">org/apache/hadoop/hbase/TestCellUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18361,19 +18367,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestCheckTestClasses.java">org/apache/hadoop/hbase/TestCheckTestClasses.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.testclassification.MediumTests' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
@@ -18382,19 +18388,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClassFinder.java">org/apache/hadoop/hbase/TestClassFinder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>189</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18403,19 +18409,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClientClusterStatus.java">org/apache/hadoop/hbase/TestClientClusterStatus.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.Threads.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18424,13 +18430,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClientOperationTimeout.java">org/apache/hadoop/hbase/TestClientOperationTimeout.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18439,13 +18445,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClusterPortAssignment.java">org/apache/hadoop/hbase/TestClusterPortAssignment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -18454,13 +18460,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestFSTableDescriptorForceCreation.java">org/apache/hadoop/hbase/TestFSTableDescriptorForceCreation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18469,43 +18475,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestGlobalMemStoreSize.java">org/apache/hadoop/hbase/TestGlobalMemStoreSize.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18514,13 +18520,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHBaseConfiguration.java">org/apache/hadoop/hbase/TestHBaseConfiguration.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18529,55 +18535,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHBaseTestingUtility.java">org/apache/hadoop/hbase/TestHBaseTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.HashMap.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.Entry.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -18586,13 +18592,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHColumnDescriptor.java">org/apache/hadoop/hbase/TestHColumnDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
@@ -18601,13 +18607,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHColumnDescriptorDefaultVersions.java">org/apache/hadoop/hbase/TestHColumnDescriptorDefaultVersions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18616,73 +18622,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHTableDescriptor.java">org/apache/hadoop/hbase/TestHTableDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>189</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 33.</td>
 <td>195</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18691,25 +18697,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestIOFencing.java">org/apache/hadoop/hbase/TestIOFencing.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.regionserver.Store.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -18718,13 +18724,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestInfoServers.java">org/apache/hadoop/hbase/TestInfoServers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18733,25 +18739,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestJMXConnectorServer.java">org/apache/hadoop/hbase/TestJMXConnectorServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.security.access.AccessControlLists.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.Threads.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18760,25 +18766,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestKeyValue.java">org/apache/hadoop/hbase/TestKeyValue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'HBaseClassTestRule' has incorrect indentation level 2, expected level should be 4.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18787,13 +18793,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestLocalHBaseCluster.java">org/apache/hadoop/hbase/TestLocalHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -18802,55 +18808,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableAccessor.java">org/apache/hadoop/hbase/TestMetaTableAccessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>218</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>219</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>235</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>273</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>296</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>308</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18859,49 +18865,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableAccessorNoCluster.java">org/apache/hadoop/hbase/TestMetaTableAccessorNoCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'(' has incorrect indentation level 6, expected level should be 8.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 122).</td>
 <td>205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18910,253 +18916,253 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableLocator.java">org/apache/hadoop/hbase/TestMetaTableLocator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>150</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>152</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>155</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>211</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>212</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>213</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>230</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>232</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>233</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>237</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>243</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>244</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>245</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>246</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>260</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>263</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>276</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>282</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>283</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>284</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>287</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>306</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>309</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>310</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>311</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>312</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>315</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>319</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>346</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>375</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -19165,19 +19171,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMovedRegionsCleaner.java">org/apache/hadoop/hbase/TestMovedRegionsCleaner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19186,31 +19192,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMultiVersions.java">org/apache/hadoop/hbase/TestMultiVersions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>84</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 5, expected level should be one of the following: 4, 6.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>195</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -19219,25 +19225,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestNamespace.java">org/apache/hadoop/hbase/TestNamespace.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>225</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>355</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -19246,13 +19252,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestNodeHealthCheckChore.java">org/apache/hadoop/hbase/TestNodeHealthCheckChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -19261,151 +19267,151 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestPartialResultsFromClientSide.java">org/apache/hadoop/hbase/TestPartialResultsFromClientSide.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>177</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>248</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>341</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>375</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>396</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>404</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>407</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>457</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>559</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>573</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>654</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>655</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>656</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>665</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>683</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>684</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>685</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>689</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>695</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>696</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19414,73 +19420,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestPerformanceEvaluation.java">org/apache/hadoop/hbase/TestPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>199</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
@@ -19489,49 +19495,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestRegionRebalancing.java">org/apache/hadoop/hbase/TestRegionRebalancing.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization lcurly' has incorrect indentation level 12, expected level should be one of the following: 10, 25, 27.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>104</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -19540,13 +19546,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestSerialization.java">org/apache/hadoop/hbase/TestSerialization.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -19555,97 +19561,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestServerSideScanMetricsFromClientSide.java">org/apache/hadoop/hbase/TestServerSideScanMetricsFromClientSide.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>112</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>113</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>115</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>142</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>215</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>321</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>322</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>327</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>328</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>329</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>330</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
@@ -19654,25 +19660,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestStochasticBalancerJmxMetrics.java">org/apache/hadoop/hbase/TestStochasticBalancerJmxMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>211</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -19681,73 +19687,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestTimeout.java">org/apache/hadoop/hbase/TestTimeout.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.Threads.</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>37</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' has incorrect indentation level 6, expected level should be 4.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -19756,91 +19762,91 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TimestampTestBase.java">org/apache/hadoop/hbase/TimestampTestBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Durability' import.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level

<TRUNCATED>

[07/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class=

<TRUNCATED>

[27/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>       

<TRUNCATED>

[34/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html
index 5f41fe7..c8158b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerReportEvent.html
@@ -524,636 +524,639 @@
 <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><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      if (!node.getTable().equals(tableName)) break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      regions.add(node);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return regions;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      if (!node.getTable().equals(tableName)) break;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      regions.add(node.toRegionState());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return regions;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      if (!node.getTable().equals(tableName)) break;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      regions.add(node.getRegionInfo());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    return regions;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    return regionsMap.values();<a name="line.547"></a>
+<span class="sourceLineNo">519</span>  public void deleteRegions(final List&lt;RegionInfo&gt; regionInfos) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    regionInfos.forEach(this::deleteRegion);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (!node.getTable().equals(tableName)) break;<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      regions.add(node);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return regions;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (!node.getTable().equals(tableName)) break;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      regions.add(node.toRegionState());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return regions;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      if (!node.getTable().equals(tableName)) break;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      regions.add(node.getRegionInfo());<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return regions;<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      regions.add(node.toRegionState());<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return regions;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  RegionState helpers<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  // ==========================================================================<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        return node.toRegionState();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  // ============================================================================================<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  //  TODO: helpers<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  // ============================================================================================<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    // TODO<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  /**<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return getRegionsOfTable(table, false);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    synchronized (node) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      if (!include(node, false)) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      if (node.isInState(State.OPEN)) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          node.getOpenSeqNum());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      } else if (node.isInState(State.OPENING)) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      } else {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        return null;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Get the regions to be reopened when modifying a table.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * &lt;p/&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<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>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p/&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * &lt;p/&gt;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * &lt;ul&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;/ul&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @param oldLoc the previous state/location of this region<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   *         means we still need to reopen the region.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    synchronized (node) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        // in OPEN state before<a name="line.644"></a>
-<span class="sourceLineNo">645</span>        if (node.isInState(State.OPEN)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>            // normal case, the region has been reopened<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            return null;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          } else {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            // the open seq num does not change, need to reopen again<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              node.getOpenSeqNum());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        } else {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          // finished maybe, but not a problem).<a name="line.656"></a>
-<span class="sourceLineNo">657</span>          return null;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      } else {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        // in OPENING state before<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          // reopened(not finished maybe, but not a problem)<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          return null;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        } else {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>          }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          // is changed to OPEN.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   */<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   *         {@link State#SPLIT} state.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      .collect(Collectors.toList());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * weed out split and offline regions.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   */<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (LOG.isTraceEnabled()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Returns the set of regions hosted by the specified server<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * @param serverName the server we are interested in<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * @return set of RegionInfo hosted by the specified server<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    synchronized (serverInfo) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return serverInfo.getRegionInfoList();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  // ============================================================================================<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  // Split helpers<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  // the ServerStateNode by calling removeServer.<a name="line.730"></a>
+<span class="sourceLineNo">550</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return regionsMap.values();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      regions.add(node.toRegionState());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return regions;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>  // ==========================================================================<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  //  RegionState helpers<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  // ==========================================================================<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        return node.toRegionState();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    return null;<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>  //  TODO: helpers<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  // ============================================================================================<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // TODO<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return getRegionsOfTable(table, false);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    synchronized (node) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      if (!include(node, false)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        return null;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      if (node.isInState(State.OPEN)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          node.getOpenSeqNum());<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      } else if (node.isInState(State.OPENING)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        return null;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Get the regions to be reopened when modifying a table.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * &lt;p/&gt;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * &lt;p/&gt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * &lt;p/&gt;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;ul&gt;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param oldLoc the previous state/location of this region<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   *         means we still need to reopen the region.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    synchronized (node) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // in OPEN state before<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        if (node.isInState(State.OPEN)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>            // normal case, the region has been reopened<a name="line.651"></a>
+<span class="sourceLineNo">652</span>            return null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>          } else {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            // the open seq num does not change, need to reopen again<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.655"></a>
+<span class="sourceLineNo">656</span>              node.getOpenSeqNum());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        } else {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // finished maybe, but not a problem).<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          return null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      } else {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        // in OPENING state before<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          // reopened(not finished maybe, but not a problem)<a name="line.667"></a>
+<span class="sourceLineNo">668</span>          return null;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        } else {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>            return null;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          // is changed to OPEN.<a name="line.675"></a>
+<span class="sourceLineNo">676</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        }<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      }<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   */<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *         {@link State#SPLIT} state.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   */<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      .collect(Collectors.toList());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<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>   * Utility. Whether to include region in list of regions. Default is to<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * weed out split and offline regions.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   */<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    if (LOG.isTraceEnabled()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.713"></a>
+<span class="sourceLineNo">714</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<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>   * Returns the set of regions hosted by the specified server<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param serverName the server we are interested in<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return set of RegionInfo hosted by the specified server<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>    synchronized (serverInfo) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      return serverInfo.getRegionInfoList();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
 <span class="sourceLineNo">731</span>  // ============================================================================================<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    synchronized (serverNode) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      serverNode.setState(state);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @see #metaLogSplit(ServerName)<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    setServerState(serverName, ServerState.SPLITTING_META);<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>  /**<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * @see #metaLogSplitting(ServerName)<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public void metaLogSplit(ServerName serverName) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   * Call this when we start log splitting for a crashed Server.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @see #logSplit(ServerName)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  public void logSplitting(final ServerName serverName) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    setServerState(serverName, ServerState.SPLITTING);<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>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Called after we've split all logs on a crashed Server.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * @see #logSplitting(ServerName)<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  public void logSplit(final ServerName serverName) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    synchronized (regionNode) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      regionNode.setState(state);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  // ============================================================================================<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  //  TODO:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  // ============================================================================================<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      if (!node.isInTransition()) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        result.add(node.getRegionInfo());<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    return result;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (region != null) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      synchronized (region) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        return region.isInState(state);<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>    return false;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    for (RegionInfo hri: regions) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      if (node == null) continue;<a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>      // TODO: State.OPEN<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      final ServerName serverName = node.getRegionLocation();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (serverName == null) continue;<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      if (serverRegions == null) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        result.put(serverName, serverRegions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      serverRegions.add(node.getRegionInfo());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    }<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return result;<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>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return assignments;<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>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    final State[] states = State.values();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<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>    for (RegionStateNode node: regionsMap.values()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      if (node.getTable().equals(tableName)) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    return tableRegions;<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>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (region != null) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      synchronized (region) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        ServerName server = region.getRegionLocation();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        return server != null ? server : region.getLastHost();<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>    return null;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Can't let out original since it can change and at least the load balancer<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return A clone of current assignments by table.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      final boolean forceByCluster) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<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>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt;(1);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return result;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      if (tableResult == null) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        tableResult = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        result.put(node.getTable(), tableResult);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      final ServerName serverName = node.getRegionLocation();<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      if (serverName == null) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.info("Skipping, no server for " + node);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        continue;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      List&lt;RegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      if (serverResult == null) {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        serverResult = new ArrayList&lt;RegionInfo&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        tableResult.put(serverName, serverResult);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      serverResult.add(node.getRegionInfo());<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add online servers with no assignment for the table.<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; table: result.values()) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        for (ServerName svr : serverMap.keySet()) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          if (!table.containsKey(svr)) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>            table.put(svr, new ArrayList&lt;RegionInfo&gt;());<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          }<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>    return result;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  // ==========================================================================<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  //  Region in transition helpers<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  // ==========================================================================<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      final RegionTransitionProcedure procedure) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return true;<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>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      final RegionTransitionProcedure procedure) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    regionNode.unsetProcedure(procedure);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>  public boolean hasRegionsInTransition() {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    return !regionInTransition.isEmpty();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>  public boolean isRegionInTransition(final RegionInfo regionInfo) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return node != null ? node.isInTransition() : false;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   */<a name="line.957"></a>
-<span class="sourceLineNo">958</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final RegionInfo hri) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (node == null) return null;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    return node.getProcedure();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
-<span class="sourceLineNo">963</span><a name="line.963"></a>
-<span class="sourceLineNo">964</span>  public RegionState getRegionTransitionState(final RegionInfo hri) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    if (node == null) return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>    synchronized (node) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      return node.isInTransition() ? node.toRegionState() : null;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>  /**<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * Get the number of regions in transition.<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  public int getRegionsInTransitionCount() {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    return regionInTransition.size();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>  }<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      rit.add(node.toRegionState());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    return rit;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      rit.add(node.toRegionState());<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return rit;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  //  Region offline helpers<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  // TODO: Unused.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public void removeFromOfflineRegions(final RegionInfo regionInfo) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    regionOffline.remove(regionInfo);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span><a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>  // ==========================================================================<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  //  Region FAIL_OPEN helpers<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  // ==========================================================================<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  public static final class RegionFailedOpen {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private final RegionStateNode regionNode;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    private volatile Exception exception = null;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    private AtomicInteger retries = new AtomicInteger();<a name="line.1021"></a>
+<span class="sourceLineNo">732</span>  // Split helpers<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  // the ServerStateNode by calling removeServer.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>  // ============================================================================================<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    synchronized (serverNode) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      serverNode.setState(state);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @see #metaLogSplit(ServerName)<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   */<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    setServerState(serverName, ServerState.SPLITTING_META);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @see #metaLogSplitting(ServerName)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public void metaLogSplit(ServerName serverName) {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * Call this when we start log splitting for a crashed Server.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @see #logSplit(ServerName)<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public void logSplitting(final ServerName serverName) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    setServerState(serverName, ServerState.SPLITTING);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  /**<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * Called after we've split all logs on a crashed Server.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * @see #logSplitting(ServerName)<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  public void logSplit(final ServerName serverName) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    synchronized (regionNode) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      regionNode.setState(state);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    }<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>  // ============================================================================================<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  //  TODO:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  // ============================================================================================<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      if (!node.isInTransition()) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        result.add(node.getRegionInfo());<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    return result;<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    if (region != null) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      synchronized (region) {<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        return region.isInState(state);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return false;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return isRegionInState(regionInfo, State.OPEN);<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionInfo hri: regions) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (node == null) continue;<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      // TODO: State.OPEN<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      final ServerName serverName = node.getRegionLocation();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      if (serverName == null) continue;<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (serverRegions == null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        result.put(serverName, serverRegions);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      serverRegions.add(node.getRegionInfo());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    return result;<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    return assignments;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    final State[] states = State.values();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      if (node.getTable().equals(tableName)) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<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>    return tableRegions;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    if (region != null) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      synchronized (region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        ServerName server = region.getRegionLocation();<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        return server != null ? server : region.getLastHost();<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      }<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    return null;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * Can't let out original since it can change and at least the load balancer<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * @return A clone of current assignments by table.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      final boolean forceByCluster) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    final Map&lt;TableName, Map&lt

<TRUNCATED>

[06/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>        previous = current;<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      }<

<TRUNCATED>

[13/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line

<TRUNCATED>

[24/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LoadCandidateGenerator.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<span class="sourceLin

<TRUNCATED>

[35/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html
index 5f41fe7..c8158b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.RegionStateStampComparator.html
@@ -524,636 +524,639 @@
 <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><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      if (!node.getTable().equals(tableName)) break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      regions.add(node);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return regions;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      if (!node.getTable().equals(tableName)) break;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      regions.add(node.toRegionState());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return regions;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      if (!node.getTable().equals(tableName)) break;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      regions.add(node.getRegionInfo());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    return regions;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    return regionsMap.values();<a name="line.547"></a>
+<span class="sourceLineNo">519</span>  public void deleteRegions(final List&lt;RegionInfo&gt; regionInfos) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    regionInfos.forEach(this::deleteRegion);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (!node.getTable().equals(tableName)) break;<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      regions.add(node);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return regions;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (!node.getTable().equals(tableName)) break;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      regions.add(node.toRegionState());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return regions;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      if (!node.getTable().equals(tableName)) break;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      regions.add(node.getRegionInfo());<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return regions;<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      regions.add(node.toRegionState());<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return regions;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  RegionState helpers<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  // ==========================================================================<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        return node.toRegionState();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  // ============================================================================================<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  //  TODO: helpers<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  // ============================================================================================<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    // TODO<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  /**<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return getRegionsOfTable(table, false);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    synchronized (node) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      if (!include(node, false)) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      if (node.isInState(State.OPEN)) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          node.getOpenSeqNum());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      } else if (node.isInState(State.OPENING)) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      } else {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        return null;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Get the regions to be reopened when modifying a table.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * &lt;p/&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<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>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p/&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * &lt;p/&gt;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * &lt;ul&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;/ul&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @param oldLoc the previous state/location of this region<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   *         means we still need to reopen the region.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    synchronized (node) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        // in OPEN state before<a name="line.644"></a>
-<span class="sourceLineNo">645</span>        if (node.isInState(State.OPEN)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>            // normal case, the region has been reopened<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            return null;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          } else {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            // the open seq num does not change, need to reopen again<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              node.getOpenSeqNum());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        } else {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          // finished maybe, but not a problem).<a name="line.656"></a>
-<span class="sourceLineNo">657</span>          return null;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      } else {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        // in OPENING state before<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          // reopened(not finished maybe, but not a problem)<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          return null;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        } else {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>          }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          // is changed to OPEN.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   */<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   *         {@link State#SPLIT} state.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      .collect(Collectors.toList());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * weed out split and offline regions.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   */<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (LOG.isTraceEnabled()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Returns the set of regions hosted by the specified server<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * @param serverName the server we are interested in<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * @return set of RegionInfo hosted by the specified server<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    synchronized (serverInfo) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return serverInfo.getRegionInfoList();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  // ============================================================================================<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  // Split helpers<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  // the ServerStateNode by calling removeServer.<a name="line.730"></a>
+<span class="sourceLineNo">550</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return regionsMap.values();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      regions.add(node.toRegionState());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return regions;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>  // ==========================================================================<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  //  RegionState helpers<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  // ==========================================================================<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        return node.toRegionState();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    return null;<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>  //  TODO: helpers<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  // ============================================================================================<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // TODO<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return getRegionsOfTable(table, false);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    synchronized (node) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      if (!include(node, false)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        return null;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      if (node.isInState(State.OPEN)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          node.getOpenSeqNum());<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      } else if (node.isInState(State.OPENING)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        return null;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Get the regions to be reopened when modifying a table.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * &lt;p/&gt;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * &lt;p/&gt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * &lt;p/&gt;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;ul&gt;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param oldLoc the previous state/location of this region<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   *         means we still need to reopen the region.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    synchronized (node) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // in OPEN state before<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        if (node.isInState(State.OPEN)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>            // normal case, the region has been reopened<a name="line.651"></a>
+<span class="sourceLineNo">652</span>            return null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>          } else {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            // the open seq num does not change, need to reopen again<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.655"></a>
+<span class="sourceLineNo">656</span>              node.getOpenSeqNum());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        } else {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // finished maybe, but not a problem).<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          return null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      } else {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        // in OPENING state before<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          // reopened(not finished maybe, but not a problem)<a name="line.667"></a>
+<span class="sourceLineNo">668</span>          return null;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        } else {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>            return null;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          // is changed to OPEN.<a name="line.675"></a>
+<span class="sourceLineNo">676</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        }<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      }<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   */<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *         {@link State#SPLIT} state.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   */<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      .collect(Collectors.toList());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<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>   * Utility. Whether to include region in list of regions. Default is to<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * weed out split and offline regions.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   */<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    if (LOG.isTraceEnabled()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.713"></a>
+<span class="sourceLineNo">714</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<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>   * Returns the set of regions hosted by the specified server<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param serverName the server we are interested in<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return set of RegionInfo hosted by the specified server<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>    synchronized (serverInfo) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      return serverInfo.getRegionInfoList();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
 <span class="sourceLineNo">731</span>  // ============================================================================================<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    synchronized (serverNode) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      serverNode.setState(state);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @see #metaLogSplit(ServerName)<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    setServerState(serverName, ServerState.SPLITTING_META);<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>  /**<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * @see #metaLogSplitting(ServerName)<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public void metaLogSplit(ServerName serverName) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   * Call this when we start log splitting for a crashed Server.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @see #logSplit(ServerName)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  public void logSplitting(final ServerName serverName) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    setServerState(serverName, ServerState.SPLITTING);<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>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Called after we've split all logs on a crashed Server.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * @see #logSplitting(ServerName)<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  public void logSplit(final ServerName serverName) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    synchronized (regionNode) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      regionNode.setState(state);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  // ============================================================================================<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  //  TODO:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  // ============================================================================================<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      if (!node.isInTransition()) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        result.add(node.getRegionInfo());<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    return result;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (region != null) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      synchronized (region) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        return region.isInState(state);<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>    return false;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    for (RegionInfo hri: regions) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      if (node == null) continue;<a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>      // TODO: State.OPEN<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      final ServerName serverName = node.getRegionLocation();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (serverName == null) continue;<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      if (serverRegions == null) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        result.put(serverName, serverRegions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      serverRegions.add(node.getRegionInfo());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    }<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return result;<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>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return assignments;<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>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    final State[] states = State.values();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<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>    for (RegionStateNode node: regionsMap.values()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      if (node.getTable().equals(tableName)) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    return tableRegions;<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>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (region != null) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      synchronized (region) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        ServerName server = region.getRegionLocation();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        return server != null ? server : region.getLastHost();<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>    return null;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Can't let out original since it can change and at least the load balancer<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return A clone of current assignments by table.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      final boolean forceByCluster) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<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>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt;(1);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return result;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      if (tableResult == null) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        tableResult = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        result.put(node.getTable(), tableResult);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      final ServerName serverName = node.getRegionLocation();<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      if (serverName == null) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.info("Skipping, no server for " + node);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        continue;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      List&lt;RegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      if (serverResult == null) {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        serverResult = new ArrayList&lt;RegionInfo&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        tableResult.put(serverName, serverResult);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      serverResult.add(node.getRegionInfo());<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add online servers with no assignment for the table.<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; table: result.values()) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        for (ServerName svr : serverMap.keySet()) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          if (!table.containsKey(svr)) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>            table.put(svr, new ArrayList&lt;RegionInfo&gt;());<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          }<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>    return result;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  // ==========================================================================<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  //  Region in transition helpers<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  // ==========================================================================<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      final RegionTransitionProcedure procedure) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return true;<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>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      final RegionTransitionProcedure procedure) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    regionNode.unsetProcedure(procedure);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>  public boolean hasRegionsInTransition() {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    return !regionInTransition.isEmpty();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>  public boolean isRegionInTransition(final RegionInfo regionInfo) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return node != null ? node.isInTransition() : false;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   */<a name="line.957"></a>
-<span class="sourceLineNo">958</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final RegionInfo hri) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (node == null) return null;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    return node.getProcedure();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
-<span class="sourceLineNo">963</span><a name="line.963"></a>
-<span class="sourceLineNo">964</span>  public RegionState getRegionTransitionState(final RegionInfo hri) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    if (node == null) return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>    synchronized (node) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      return node.isInTransition() ? node.toRegionState() : null;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>  /**<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * Get the number of regions in transition.<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  public int getRegionsInTransitionCount() {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    return regionInTransition.size();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>  }<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      rit.add(node.toRegionState());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    return rit;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      rit.add(node.toRegionState());<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return rit;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  //  Region offline helpers<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  // TODO: Unused.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public void removeFromOfflineRegions(final RegionInfo regionInfo) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    regionOffline.remove(regionInfo);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span><a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>  // ==========================================================================<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  //  Region FAIL_OPEN helpers<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  // ==========================================================================<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  public static final class RegionFailedOpen {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private final RegionStateNode regionNode;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    private volatile Exception exception = null;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    private AtomicInteger retries = new AtomicInteger();<a name="line.1021"></a>
+<span class="sourceLineNo">732</span>  // Split helpers<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  // the ServerStateNode by calling removeServer.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>  // ============================================================================================<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    synchronized (serverNode) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      serverNode.setState(state);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @see #metaLogSplit(ServerName)<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   */<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    setServerState(serverName, ServerState.SPLITTING_META);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @see #metaLogSplitting(ServerName)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public void metaLogSplit(ServerName serverName) {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * Call this when we start log splitting for a crashed Server.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @see #logSplit(ServerName)<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public void logSplitting(final ServerName serverName) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    setServerState(serverName, ServerState.SPLITTING);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  /**<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * Called after we've split all logs on a crashed Server.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * @see #logSplitting(ServerName)<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  public void logSplit(final ServerName serverName) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    synchronized (regionNode) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      regionNode.setState(state);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    }<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>  // ============================================================================================<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  //  TODO:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  // ============================================================================================<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      if (!node.isInTransition()) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        result.add(node.getRegionInfo());<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    return result;<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    if (region != null) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      synchronized (region) {<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        return region.isInState(state);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return false;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return isRegionInState(regionInfo, State.OPEN);<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionInfo hri: regions) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (node == null) continue;<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      // TODO: State.OPEN<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      final ServerName serverName = node.getRegionLocation();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      if (serverName == null) continue;<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (serverRegions == null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        result.put(serverName, serverRegions);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      serverRegions.add(node.getRegionInfo());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    return result;<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    return assignments;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    final State[] states = State.values();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      if (node.getTable().equals(tableName)) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<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>    return tableRegions;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    if (region != null) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      synchronized (region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        ServerName server = region.getRegionLocation();<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        return server != null ? server : region.getLastHost();<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      }<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    return null;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * Can't let out original since it can change and at least the load balancer<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * @return A clone of current assignments by table.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      final boolean forceByCluster) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.892"></a>
+<span class="sourceLineNo"

<TRUNCATED>

[43/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
index 386162a..6e644bf 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1174">StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1173">StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Compute the cost of a potential cluster state from skew in number of
  primary regions on a cluster.</div>
@@ -230,7 +230,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>PRIMARY_REGION_COUNT_SKEW_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1175">PRIMARY_REGION_COUNT_SKEW_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1174">PRIMARY_REGION_COUNT_SKEW_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.PRIMARY_REGION_COUNT_SKEW_COST_KEY">Constant Field Values</a></dd>
@@ -243,7 +243,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1177">DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1176">DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST">Constant Field Values</a></dd>
@@ -256,7 +256,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stats</h4>
-<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1179">stats</a></pre>
+<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1178">stats</a></pre>
 </li>
 </ul>
 </li>
@@ -273,7 +273,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PrimaryRegionCountSkewCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1181">PrimaryRegionCountSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1180">PrimaryRegionCountSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -290,7 +290,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cost</h4>
-<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1189">cost</a>()</pre>
+<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.html#line.1188">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
index 1030aa6..cd4a941 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1344">StochasticLoadBalancer.RackLocalityCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1343">StochasticLoadBalancer.RackLocalityCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.LocalityBasedCostFunction</a></pre>
 </li>
 </ul>
@@ -239,7 +239,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>RACK_LOCALITY_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1346">RACK_LOCALITY_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1345">RACK_LOCALITY_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RackLocalityCostFunction.RACK_LOCALITY_COST_KEY">Constant Field Values</a></dd>
@@ -252,7 +252,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_RACK_LOCALITY_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1347">DEFAULT_RACK_LOCALITY_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1346">DEFAULT_RACK_LOCALITY_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RackLocalityCostFunction.DEFAULT_RACK_LOCALITY_COST">Constant Field Values</a></dd>
@@ -273,7 +273,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RackLocalityCostFunction</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1349">RackLocalityCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1348">RackLocalityCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                 <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services)</pre>
 </li>
 </ul>
@@ -291,7 +291,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionIndexToEntityIndex</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1360">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RackLocalityCostFunction.html#line.1359">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#regionIndexToEntityIndex-int-">StochasticLoadBalancer.LocalityBasedCostFunction</a></code></span></div>
 <div class="block">Maps region to the current entity (server or rack) on which it is stored</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
index 5b1d26a..aedf61e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.727">StochasticLoadBalancer.RandomCandidateGenerator</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.726">StochasticLoadBalancer.RandomCandidateGenerator</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CandidateGenerator</a></pre>
 </li>
 </ul>
@@ -194,7 +194,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomCandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html#line.727">RandomCandidateGenerator</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html#line.726">RandomCandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -211,7 +211,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>generate</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html#line.730">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html#line.729">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#generate-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">generate</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CandidateGenerator</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
index 99265cf..0858b00 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1463">StochasticLoadBalancer.ReadRequestCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1462">StochasticLoadBalancer.ReadRequestCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a></pre>
 <div class="block">Compute the cost of total number of read requests  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -250,7 +250,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>READ_REQUEST_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1465">READ_REQUEST_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1464">READ_REQUEST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.ReadRequestCostFunction.READ_REQUEST_COST_KEY">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_READ_REQUEST_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1467">DEFAULT_READ_REQUEST_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1466">DEFAULT_READ_REQUEST_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.ReadRequestCostFunction.DEFAULT_READ_REQUEST_COST">Constant Field Values</a></dd>
@@ -284,7 +284,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ReadRequestCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1469">ReadRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1468">ReadRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1475">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ReadRequestCostFunction.html#line.1474">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
index 3537d59..8f3dc60 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1143">StochasticLoadBalancer.RegionCountSkewCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1142">StochasticLoadBalancer.RegionCountSkewCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Compute the cost of a potential cluster state from skew in number of
  regions on a cluster.</div>
@@ -230,7 +230,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>REGION_COUNT_SKEW_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1144">REGION_COUNT_SKEW_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1143">REGION_COUNT_SKEW_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionCountSkewCostFunction.REGION_COUNT_SKEW_COST_KEY">Constant Field Values</a></dd>
@@ -243,7 +243,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_REGION_COUNT_SKEW_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1146">DEFAULT_REGION_COUNT_SKEW_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1145">DEFAULT_REGION_COUNT_SKEW_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionCountSkewCostFunction.DEFAULT_REGION_COUNT_SKEW_COST">Constant Field Values</a></dd>
@@ -256,7 +256,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stats</h4>
-<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1148">stats</a></pre>
+<pre>private&nbsp;double[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1147">stats</a></pre>
 </li>
 </ul>
 </li>
@@ -273,7 +273,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionCountSkewCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1150">RegionCountSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1149">RegionCountSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -290,7 +290,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cost</h4>
-<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1157">cost</a>()</pre>
+<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionCountSkewCostFunction.html#line.1156">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html
index f7883be..3d27554 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.856">StochasticLoadBalancer.RegionReplicaCandidateGenerator</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.855">StochasticLoadBalancer.RegionReplicaCandidateGenerator</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CandidateGenerator</a></pre>
 <div class="block">Generates candidates which moves the replicas out of the region server for
  co-hosted region replicas</div>
@@ -228,7 +228,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>randomGenerator</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RandomCandidateGenerator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#line.858">randomGenerator</a></pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RandomCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RandomCandidateGenerator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#line.857">randomGenerator</a></pre>
 </li>
 </ul>
 </li>
@@ -245,7 +245,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaCandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#line.856">RegionReplicaCandidateGenerator</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#line.855">RegionReplicaCandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -262,7 +262,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>selectCoHostedRegionPerGroup</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#line.869">selectCoHostedRegionPerGroup</a>(int[]&nbsp;primariesOfRegionsPerGroup,
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#line.868">selectCoHostedRegionPerGroup</a>(int[]&nbsp;primariesOfRegionsPerGroup,
                                  int[]&nbsp;regionsPerGroup,
                                  int[]&nbsp;regionIndexToPrimaryIndex)</pre>
 <div class="block">Randomly select one regionIndex out of all region replicas co-hosted in the same group
@@ -284,7 +284,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>generate</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#line.913">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#line.912">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html#generate-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">generate</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CandidateGenerator</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
index 70284ff..1faf326 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1529">StochasticLoadBalancer.RegionReplicaHostCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1528">StochasticLoadBalancer.RegionReplicaHostCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">A cost function for region replicas. We give a very high cost to hosting
  replicas of the same region in the same host. We do not prevent the case
@@ -272,7 +272,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>REGION_REPLICA_HOST_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1530">REGION_REPLICA_HOST_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1529">REGION_REPLICA_HOST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionReplicaHostCostFunction.REGION_REPLICA_HOST_COST_KEY">Constant Field Values</a></dd>
@@ -285,7 +285,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_REGION_REPLICA_HOST_COST_KEY</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1532">DEFAULT_REGION_REPLICA_HOST_COST_KEY</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1531">DEFAULT_REGION_REPLICA_HOST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionReplicaHostCostFunction.DEFAULT_REGION_REPLICA_HOST_COST_KEY">Constant Field Values</a></dd>
@@ -298,7 +298,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>maxCost</h4>
-<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1534">maxCost</a></pre>
+<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1533">maxCost</a></pre>
 </li>
 </ul>
 <a name="costsPerGroup">
@@ -307,7 +307,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>costsPerGroup</h4>
-<pre>long[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1535">costsPerGroup</a></pre>
+<pre>long[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1534">costsPerGroup</a></pre>
 </li>
 </ul>
 <a name="primariesOfRegionsPerGroup">
@@ -316,7 +316,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>primariesOfRegionsPerGroup</h4>
-<pre>int[][] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1536">primariesOfRegionsPerGroup</a></pre>
+<pre>int[][] <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1535">primariesOfRegionsPerGroup</a></pre>
 </li>
 </ul>
 </li>
@@ -333,7 +333,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaHostCostFunction</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1538">RegionReplicaHostCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1537">RegionReplicaHostCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -350,7 +350,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1545">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1544">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">StochasticLoadBalancer.CostFunction</a></code></span></div>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
@@ -366,7 +366,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxCost</h4>
-<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1558">getMaxCost</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1557">getMaxCost</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="isNeeded--">
@@ -375,7 +375,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>isNeeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1574">isNeeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1573">isNeeded</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#isNeeded--">isNeeded</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -388,7 +388,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>cost</h4>
-<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1579">cost</a>()</pre>
+<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1578">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>
@@ -401,7 +401,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>costPerGroup</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1599">costPerGroup</a>(int[]&nbsp;primariesOfRegions)</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1598">costPerGroup</a>(int[]&nbsp;primariesOfRegions)</pre>
 <div class="block">For each primary region, it computes the total number of replicas in the array (numReplicas)
  and returns a sum of numReplicas-1 squared. For example, if the server hosts
  regions a, b, c, d, e, f where a and b are same replicas, and c,d,e are same replicas, it
@@ -420,7 +420,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionMoved</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1622">regionMoved</a>(int&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html#line.1621">regionMoved</a>(int&nbsp;region,
                            int&nbsp;oldServer,
                            int&nbsp;newServer)</pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
index 8892564..42c6ff3 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.940">StochasticLoadBalancer.RegionReplicaRackCandidateGenerator</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.939">StochasticLoadBalancer.RegionReplicaRackCandidateGenerator</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RegionReplicaCandidateGenerator</a></pre>
 <div class="block">Generates candidates which moves the replicas out of the rack for
  co-hosted region replicas in the same rack</div>
@@ -223,7 +223,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaRackCandidateGenerator</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html#line.940">RegionReplicaRackCandidateGenerator</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html#line.939">RegionReplicaRackCandidateGenerator</a>()</pre>
 </li>
 </ul>
 </li>
@@ -240,7 +240,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>generate</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html#line.942">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCandidateGenerator.html#line.941">generate</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html#generate-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">generate</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaCandidateGenerator.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RegionReplicaCandidateGenerator</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
index fa8a57d..f1d8e86 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1645">StochasticLoadBalancer.RegionReplicaRackCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1644">StochasticLoadBalancer.RegionReplicaRackCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaHostCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.RegionReplicaHostCostFunction</a></pre>
 <div class="block">A cost function for region replicas for the rack distribution. We give a relatively high
  cost to hosting replicas of the same region in the same rack. We do not prevent the case
@@ -255,7 +255,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>REGION_REPLICA_RACK_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1646">REGION_REPLICA_RACK_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1645">REGION_REPLICA_RACK_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionReplicaRackCostFunction.REGION_REPLICA_RACK_COST_KEY">Constant Field Values</a></dd>
@@ -268,7 +268,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_REGION_REPLICA_RACK_COST_KEY</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1648">DEFAULT_REGION_REPLICA_RACK_COST_KEY</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1647">DEFAULT_REGION_REPLICA_RACK_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.RegionReplicaRackCostFunction.DEFAULT_REGION_REPLICA_RACK_COST_KEY">Constant Field Values</a></dd>
@@ -289,7 +289,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaRackCostFunction</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1650">RegionReplicaRackCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1649">RegionReplicaRackCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -306,7 +306,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1657">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1656">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#init-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-">StochasticLoadBalancer.CostFunction</a></code></span></div>
 <div class="block">Called once per LB invocation to give the cost function
  to initialize it's state, and perform any costly calculation.</div>
@@ -322,7 +322,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionMoved</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1672">regionMoved</a>(int&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html#line.1671">regionMoved</a>(int&nbsp;region,
                            int&nbsp;oldServer,
                            int&nbsp;newServer)</pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
index ff8d8bc..daf34d7 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1323">StochasticLoadBalancer.ServerLocalityCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1322">StochasticLoadBalancer.ServerLocalityCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.LocalityBasedCostFunction</a></pre>
 </li>
 </ul>
@@ -239,7 +239,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>LOCALITY_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1325">LOCALITY_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1324">LOCALITY_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.ServerLocalityCostFunction.LOCALITY_COST_KEY">Constant Field Values</a></dd>
@@ -252,7 +252,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_LOCALITY_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1326">DEFAULT_LOCALITY_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1325">DEFAULT_LOCALITY_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.ServerLocalityCostFunction.DEFAULT_LOCALITY_COST">Constant Field Values</a></dd>
@@ -273,7 +273,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ServerLocalityCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1328">ServerLocalityCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1327">ServerLocalityCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                            <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;srv)</pre>
 </li>
 </ul>
@@ -291,7 +291,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionIndexToEntityIndex</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1339">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html#line.1338">regionIndexToEntityIndex</a>(int&nbsp;region)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.LocalityBasedCostFunction.html#regionIndexToEntityIndex-int-">StochasticLoadBalancer.LocalityBasedCostFunction</a></code></span></div>
 <div class="block">Maps region to the current entity (server or rack) on which it is stored</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
index 0d714d8..ab93517 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1710">StochasticLoadBalancer.StoreFileCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1709">StochasticLoadBalancer.StoreFileCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></pre>
 <div class="block">Compute the cost of total open storefiles size.  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -238,7 +238,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>STOREFILE_SIZE_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1712">STOREFILE_SIZE_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1711">STOREFILE_SIZE_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.StoreFileCostFunction.STOREFILE_SIZE_COST_KEY">Constant Field Values</a></dd>
@@ -251,7 +251,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_STOREFILE_SIZE_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1714">DEFAULT_STOREFILE_SIZE_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1713">DEFAULT_STOREFILE_SIZE_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.StoreFileCostFunction.DEFAULT_STOREFILE_SIZE_COST">Constant Field Values</a></dd>
@@ -272,7 +272,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StoreFileCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1716">StoreFileCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1715">StoreFileCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -289,7 +289,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1722">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.StoreFileCostFunction.html#line.1721">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
index 4075305..818fe2b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1214">StochasticLoadBalancer.TableSkewCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1213">StochasticLoadBalancer.TableSkewCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></pre>
 <div class="block">Compute the cost of a potential cluster configuration based upon how evenly
  distributed tables are.</div>
@@ -226,7 +226,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_SKEW_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1216">TABLE_SKEW_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1215">TABLE_SKEW_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.TableSkewCostFunction.TABLE_SKEW_COST_KEY">Constant Field Values</a></dd>
@@ -239,7 +239,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_TABLE_SKEW_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1218">DEFAULT_TABLE_SKEW_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1217">DEFAULT_TABLE_SKEW_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.TableSkewCostFunction.DEFAULT_TABLE_SKEW_COST">Constant Field Values</a></dd>
@@ -260,7 +260,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TableSkewCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1220">TableSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1219">TableSkewCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -277,7 +277,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cost</h4>
-<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1226">cost</a>()</pre>
+<pre>double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.TableSkewCostFunction.html#line.1225">cost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#cost--">cost</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
index 3fe8a08..300ed18 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1506">StochasticLoadBalancer.WriteRequestCostFunction</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1505">StochasticLoadBalancer.WriteRequestCostFunction</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadAsRateFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadAsRateFunction</a></pre>
 <div class="block">Compute the cost of total number of write requests.  The more unbalanced the higher the
  computed cost will be.  This uses a rolling average of regionload.</div>
@@ -250,7 +250,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockList">
 <li class="blockList">
 <h4>WRITE_REQUEST_COST_KEY</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1508">WRITE_REQUEST_COST_KEY</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1507">WRITE_REQUEST_COST_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.WriteRequestCostFunction.WRITE_REQUEST_COST_KEY">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEFAULT_WRITE_REQUEST_COST</h4>
-<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1510">DEFAULT_WRITE_REQUEST_COST</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1509">DEFAULT_WRITE_REQUEST_COST</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.WriteRequestCostFunction.DEFAULT_WRITE_REQUEST_COST">Constant Field Values</a></dd>
@@ -284,7 +284,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WriteRequestCostFunction</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1512">WriteRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1511">WriteRequestCostFunction</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/Stoch
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCostFromRl</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1518">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.WriteRequestCostFunction.html#line.1517">getCostFromRl</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BalancerRegionLoad.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerRegionLoad</a>&nbsp;rl)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html#getCostFromRl-org.apache.hadoop.hbase.master.balancer.BalancerRegionLoad-">getCostFromRl</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFromRegionLoadFunction</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
index 1e758ac..eb81762 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
@@ -1210,7 +1210,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>initCosts</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.550">initCosts</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.549">initCosts</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster)</pre>
 </li>
 </ul>
 <a name="updateCostsWithAction-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster-org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action-">
@@ -1219,7 +1219,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>updateCostsWithAction</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.556">updateCostsWithAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.555">updateCostsWithAction</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                                      <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster.Action</a>&nbsp;action)</pre>
 </li>
 </ul>
@@ -1229,7 +1229,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>getCostFunctionNames</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.565">getCostFunctionNames</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.564">getCostFunctionNames</a>()</pre>
 <div class="block">Get the names of the cost functions</div>
 </li>
 </ul>
@@ -1239,7 +1239,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>computeCost</h4>
-<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.585">computeCost</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
+<pre>protected&nbsp;double&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.584">computeCost</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer">BaseLoadBalancer.Cluster</a>&nbsp;cluster,
                              double&nbsp;previousCost)</pre>
 <div class="block">This is the main cost function.  It will compute a cost associated with a proposed cluster
  state.  All different costs will be combined with their multipliers to produce a double cost.</div>
@@ -1259,7 +1259,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockListLast">
 <li class="blockList">
 <h4>composeAttributeName</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1730">composeAttributeName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html#line.1729">composeAttributeName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;costFunctionName)</pre>
 <div class="block">A helper function to compose the attribute name from tablename and costfunction name</div>
 </li>

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


[40/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html
index 0a50aef..e72eea3 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html
@@ -129,7 +129,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.84">RegionReplicaReplicationEndpoint</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.85">RegionReplicaReplicationEndpoint</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.html" title="class in org.apache.hadoop.hbase.replication">HBaseReplicationEndpoint</a></pre>
 <div class="block">A <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.html" title="interface in org.apache.hadoop.hbase.replication"><code>ReplicationEndpoint</code></a> endpoint
  which receives the WAL edits from the WAL, and sends the edits to replicas
@@ -384,7 +384,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.86">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.87">LOG</a></pre>
 </li>
 </ul>
 <a name="CLIENT_RETRIES_NUMBER">
@@ -393,7 +393,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>CLIENT_RETRIES_NUMBER</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.89">CLIENT_RETRIES_NUMBER</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.90">CLIENT_RETRIES_NUMBER</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -402,7 +402,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.92">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.93">conf</a></pre>
 </li>
 </ul>
 <a name="connection">
@@ -411,7 +411,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.93">connection</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.94">connection</a></pre>
 </li>
 </ul>
 <a name="tableDescriptors">
@@ -420,7 +420,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>tableDescriptors</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.94">tableDescriptors</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.95">tableDescriptors</a></pre>
 </li>
 </ul>
 <a name="controller">
@@ -429,7 +429,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>controller</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.PipelineController.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.PipelineController</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.97">controller</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.PipelineController.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.PipelineController</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.98">controller</a></pre>
 </li>
 </ul>
 <a name="outputSink">
@@ -438,7 +438,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>outputSink</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.98">outputSink</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.99">outputSink</a></pre>
 </li>
 </ul>
 <a name="entryBuffers">
@@ -447,7 +447,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>entryBuffers</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.EntryBuffers.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.EntryBuffers</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.99">entryBuffers</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALSplitter.EntryBuffers.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.EntryBuffers</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.100">entryBuffers</a></pre>
 </li>
 </ul>
 <a name="numWriterThreads">
@@ -456,7 +456,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>numWriterThreads</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.102">numWriterThreads</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.103">numWriterThreads</a></pre>
 </li>
 </ul>
 <a name="operationTimeout">
@@ -465,7 +465,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>operationTimeout</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.104">operationTimeout</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.105">operationTimeout</a></pre>
 </li>
 </ul>
 <a name="pool">
@@ -474,7 +474,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>pool</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.106">pool</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.107">pool</a></pre>
 </li>
 </ul>
 </li>
@@ -491,7 +491,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionReplicaReplicationEndpoint</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.84">RegionReplicaReplicationEndpoint</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.85">RegionReplicaReplicationEndpoint</a>()</pre>
 </li>
 </ul>
 </li>
@@ -508,7 +508,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.109">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.Context.html" title="class in org.apache.hadoop.hbase.replication">ReplicationEndpoint.Context</a>&nbsp;context)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.110">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.Context.html" title="class in org.apache.hadoop.hbase.replication">ReplicationEndpoint.Context</a>&nbsp;context)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.html#init-org.apache.hadoop.hbase.replication.ReplicationEndpoint.Context-">ReplicationEndpoint</a></code></span></div>
 <div class="block">Initialize the replication endpoint with the given context.</div>
@@ -530,7 +530,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>doStart</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.143">doStart</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.144">doStart</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.html#doStart--">doStart</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.html" title="class in org.apache.hadoop.hbase.replication">HBaseReplicationEndpoint</a></code></dd>
@@ -543,7 +543,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>doStop</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.158">doStop</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.159">doStop</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.html#doStop--">doStop</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.html" title="class in org.apache.hadoop.hbase.replication">HBaseReplicationEndpoint</a></code></dd>
@@ -556,7 +556,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>getDefaultThreadPool</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.192">getDefaultThreadPool</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.193">getDefaultThreadPool</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Returns a Thread pool for the RPC's to region replicas. Similar to
  Connection's thread pool.</div>
 </li>
@@ -567,7 +567,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>replicate</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.214">replicate</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.ReplicateContext.html" title="class in org.apache.hadoop.hbase.replication">ReplicationEndpoint.ReplicateContext</a>&nbsp;replicateContext)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.215">replicate</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.ReplicateContext.html" title="class in org.apache.hadoop.hbase.replication">ReplicationEndpoint.ReplicateContext</a>&nbsp;replicateContext)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.html#replicate-org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext-">ReplicationEndpoint</a></code></span></div>
 <div class="block">Replicate the given set of entries (in the context) to the other cluster.
  Can block until all the given entries are replicated. Upon this method is returned,
@@ -586,7 +586,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockList">
 <li class="blockList">
 <h4>canReplicateToSameCluster</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.260">canReplicateToSameCluster</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.261">canReplicateToSameCluster</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationEndpoint.html#canReplicateToSameCluster--">ReplicationEndpoint</a></code></span></div>
 <div class="block">Whether or not, the replication endpoint can replicate to it's source cluster with the same
  UUID</div>
@@ -604,7 +604,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/replication/HBaseRepl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getScopeWALEntryFilter</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/WALEntryFilter.html" title="interface in org.apache.hadoop.hbase.replication">WALEntryFilter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.265">getScopeWALEntryFilter</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/replication/WALEntryFilter.html" title="interface in org.apache.hadoop.hbase.replication">WALEntryFilter</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.html#line.266">getScopeWALEntryFilter</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/replication/BaseReplicationEndpoint.html#getScopeWALEntryFilter--">BaseReplicationEndpoint</a></code></span></div>
 <div class="block">Returns a WALEntryFilter for checking the scope. Subclasses can
  return null if they don't want this filter</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
index c04b07c..c76e6b8 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
@@ -119,10 +119,11 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-">RegionReplicaSinkWriter</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaSinkWriter.html#RegionReplicaSinkWriter-org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.RegionReplicaOutputSink-org.apache.hadoop.hbase.client.ClusterConnection-java.util.concurrent.ExecutorService-int-org.apache.hadoop.hbase.TableDescriptors-">RegionReplicaSinkWriter</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">RegionReplicaReplicationEndpoint.RegionReplicaOutputSink</a>&nbsp;sink,
                        <a href="../../../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool,
-                       int&nbsp;operationTimeout)</code>&nbsp;</td>
+                       int&nbsp;operationTimeout,
+                       <a href="../../../../../../../org/apache/hadoop/hbase/TableDescriptors.html" title="interface in org.apache.hadoop.hbase">TableDescriptors</a>&nbsp;tableDescriptors)</code>&nbsp;</td>
 </tr>
 </tbody>
 </table>

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html b/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html
index 8e4a9fe..97d4369 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.280">RestoreSnapshotHelper.RestoreMetaChanges</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.281">RestoreSnapshotHelper.RestoreMetaChanges</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Describe the set of operations needed to update hbase:meta after restore.</div>
 </li>
@@ -272,7 +272,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>parentsMap</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.281">parentsMap</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.282">parentsMap</a></pre>
 </li>
 </ul>
 <a name="htd">
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>htd</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.282">htd</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.283">htd</a></pre>
 </li>
 </ul>
 <a name="regionsToRestore">
@@ -290,7 +290,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsToRestore</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.284">regionsToRestore</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.285">regionsToRestore</a></pre>
 </li>
 </ul>
 <a name="regionsToRemove">
@@ -299,7 +299,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsToRemove</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.285">regionsToRemove</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.286">regionsToRemove</a></pre>
 </li>
 </ul>
 <a name="regionsToAdd">
@@ -308,7 +308,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionsToAdd</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.286">regionsToAdd</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.287">regionsToAdd</a></pre>
 </li>
 </ul>
 </li>
@@ -325,7 +325,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RestoreMetaChanges</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.288">RestoreMetaChanges</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.289">RestoreMetaChanges</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;parentsMap)</pre>
 </li>
 </ul>
@@ -343,7 +343,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDescriptor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.293">getTableDescriptor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.294">getTableDescriptor</a>()</pre>
 </li>
 </ul>
 <a name="getParentToChildrenPairMap--">
@@ -352,7 +352,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getParentToChildrenPairMap</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.301">getParentToChildrenPairMap</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.302">getParentToChildrenPairMap</a>()</pre>
 <div class="block">Returns the map of parent-children_pair.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -366,7 +366,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasRegionsToAdd</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.308">hasRegionsToAdd</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.309">hasRegionsToAdd</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if there're new regions</dd>
@@ -379,7 +379,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsToAdd</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.318">getRegionsToAdd</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.319">getRegionsToAdd</a>()</pre>
 <div class="block">Returns the list of new regions added during the on-disk restore.
  The caller is responsible to add the regions to META.
  e.g MetaTableAccessor.addRegionsToMeta(...)</div>
@@ -395,7 +395,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasRegionsToRestore</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.325">hasRegionsToRestore</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.326">hasRegionsToRestore</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if there're regions to restore</dd>
@@ -408,7 +408,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsToRestore</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.334">getRegionsToRestore</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.335">getRegionsToRestore</a>()</pre>
 <div class="block">Returns the list of 'restored regions' during the on-disk restore.
  The caller is responsible to add the regions to hbase:meta if not present.</div>
 <dl>
@@ -423,7 +423,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasRegionsToRemove</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.341">hasRegionsToRemove</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.342">hasRegionsToRemove</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if there're regions to remove</dd>
@@ -436,7 +436,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsToRemove</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.351">getRegionsToRemove</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.352">getRegionsToRemove</a>()</pre>
 <div class="block">Returns the list of regions removed during the on-disk restore.
  The caller is responsible to remove the regions from META.
  e.g. MetaTableAccessor.deleteRegions(...)</div>
@@ -452,7 +452,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setNewRegions</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.355">setNewRegions</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;hris)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.356">setNewRegions</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;hris)</pre>
 </li>
 </ul>
 <a name="addRegionToRemove-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -461,7 +461,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionToRemove</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.363">addRegionToRemove</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.364">addRegionToRemove</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</pre>
 </li>
 </ul>
 <a name="addRegionToRestore-org.apache.hadoop.hbase.client.RegionInfo-">
@@ -470,7 +470,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionToRestore</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.370">addRegionToRestore</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.371">addRegionToRestore</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri)</pre>
 </li>
 </ul>
 <a name="updateMetaParentRegions-org.apache.hadoop.hbase.client.Connection-java.util.List-">
@@ -479,7 +479,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>updateMetaParentRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.377">updateMetaParentRegions</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html#line.378">updateMetaParentRegions</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regionInfos)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html b/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html
index 6e9d85c..44628e7 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html
@@ -671,7 +671,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>removeHdfsRegions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.418">removeHdfsRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;exec,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.419">removeHdfsRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;exec,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Remove specified regions from the file-system, using the archiver.</div>
@@ -687,7 +687,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreHdfsRegions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.432">restoreHdfsRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;exec,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.433">restoreHdfsRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;exec,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;regionManifests,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -704,7 +704,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreHdfsMobRegions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.447">restoreHdfsMobRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;exec,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.448">restoreHdfsMobRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;exec,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;regionManifests,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -721,7 +721,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionHFileReferences</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.StoreFile&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.459">getRegionHFileReferences</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.StoreFile&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.460">getRegionHFileReferences</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)</pre>
 </li>
 </ul>
 <a name="restoreRegion-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest-">
@@ -730,7 +730,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.474">restoreRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.475">restoreRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                            org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;regionManifest)
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Restore region by removing files not in the snapshot
@@ -747,7 +747,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreMobRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.483">restoreMobRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.484">restoreMobRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                               org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;regionManifest)
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Restore mob region by removing files not in the snapshot
@@ -764,7 +764,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.496">restoreRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.497">restoreRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                            org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;regionManifest,
                            org.apache.hadoop.fs.Path&nbsp;regionDir)
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -782,7 +782,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionFamilyFiles</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.562">getTableRegionFamilyFiles</a>(org.apache.hadoop.fs.Path&nbsp;familyDir)
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.563">getTableRegionFamilyFiles</a>(org.apache.hadoop.fs.Path&nbsp;familyDir)
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -798,7 +798,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cloneHdfsRegions</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.579">cloneHdfsRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;exec,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.580">cloneHdfsRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;exec,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;regionManifests,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;regions)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -816,7 +816,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cloneHdfsMobRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.620">cloneHdfsMobRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;regionManifests,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.621">cloneHdfsMobRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;regionManifests,
                                 <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Clone the mob region. For the region create a new region
@@ -833,7 +833,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cloneRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.638">cloneRegion</a>(org.apache.hadoop.fs.Path&nbsp;regionDir,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.639">cloneRegion</a>(org.apache.hadoop.fs.Path&nbsp;regionDir,
                          <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;snapshotRegionInfo,
                          org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -858,7 +858,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cloneRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.661">cloneRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.662">cloneRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                          <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;snapshotRegionInfo,
                          org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -883,7 +883,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreStoreFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.680">restoreStoreFile</a>(org.apache.hadoop.fs.Path&nbsp;familyDir,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.681">restoreStoreFile</a>(org.apache.hadoop.fs.Path&nbsp;familyDir,
                               <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                               org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.StoreFile&nbsp;storeFile,
                               boolean&nbsp;createBackRef)
@@ -912,7 +912,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreReferenceFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.711">restoreReferenceFile</a>(org.apache.hadoop.fs.Path&nbsp;familyDir,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.712">restoreReferenceFile</a>(org.apache.hadoop.fs.Path&nbsp;familyDir,
                                   <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                   org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.StoreFile&nbsp;storeFile)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -945,7 +945,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cloneRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.782">cloneRegionInfo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;snapshotRegionInfo)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.783">cloneRegionInfo</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;snapshotRegionInfo)</pre>
 <div class="block">Create a new <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client"><code>RegionInfo</code></a> from the snapshot region info.
  Keep the same startKey, endKey, regionId and split information but change
  the table name.</div>
@@ -963,7 +963,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cloneRegionInfo</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.786">cloneRegionInfo</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.787">cloneRegionInfo</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                          <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;snapshotRegionInfo)</pre>
 </li>
 </ul>
@@ -973,7 +973,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegions</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.799">getTableRegions</a>()
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.800">getTableRegions</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -989,7 +989,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>copySnapshotForScanner</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html" title="class in org.apache.hadoop.hbase.snapshot">RestoreSnapshotHelper.RestoreMetaChanges</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.823">copySnapshotForScanner</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.RestoreMetaChanges.html" title="class in org.apache.hadoop.hbase.snapshot">RestoreSnapshotHelper.RestoreMetaChanges</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.824">copySnapshotForScanner</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                               org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                                               org.apache.hadoop.fs.Path&nbsp;rootDir,
                                                                               org.apache.hadoop.fs.Path&nbsp;restoreDir,
@@ -1014,7 +1014,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>restoreSnapshotAcl</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.856">restoreSnapshotAcl</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.html#line.857">restoreSnapshotAcl</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                       <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;newTableName,
                                       org.apache.hadoop.conf.Configuration&nbsp;conf)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>

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

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


[50/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/apidocs/src-html/org/apache/hadoop/hbase/ServerName.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/ServerName.html b/apidocs/src-html/org/apache/hadoop/hbase/ServerName.html
index f9b4f3e..88e84b4 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/ServerName.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/ServerName.html
@@ -35,156 +35,156 @@
 <span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.net.Address;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">030</span>import org.apache.hbase.thirdparty.com.google.common.collect.Interner;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hbase.thirdparty.com.google.common.collect.Interners;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hbase.thirdparty.com.google.common.net.InetAddresses;<a name="line.32"></a>
-<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
 <span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>/**<a name="line.35"></a>
-<span class="sourceLineNo">036</span> * Name of a particular incarnation of an HBase Server.<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * A {@link ServerName} is used uniquely identifying a server instance in a cluster and is made<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * of the combination of hostname, port, and startcode.  The startcode distinguishes restarted<a name="line.38"></a>
-<span class="sourceLineNo">039</span> * servers on same hostname and port (startcode is usually timestamp of server startup). The<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * {@link #toString()} format of ServerName is safe to use in the  filesystem and as znode name<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * up in ZooKeeper.  Its format is:<a name="line.41"></a>
-<span class="sourceLineNo">042</span> * &lt;code&gt;&amp;lt;hostname&amp;gt; '{@link #SERVERNAME_SEPARATOR}' &amp;lt;port&amp;gt;<a name="line.42"></a>
-<span class="sourceLineNo">043</span> * '{@link #SERVERNAME_SEPARATOR}' &amp;lt;startcode&amp;gt;&lt;/code&gt;.<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * For example, if hostname is &lt;code&gt;www.example.org&lt;/code&gt;, port is &lt;code&gt;1234&lt;/code&gt;,<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * and the startcode for the regionserver is &lt;code&gt;1212121212&lt;/code&gt;, then<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * the {@link #toString()} would be &lt;code&gt;www.example.org,1234,1212121212&lt;/code&gt;.<a name="line.46"></a>
-<span class="sourceLineNo">047</span> *<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * &lt;p&gt;You can obtain a versioned serialized form of this class by calling<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * {@link #getVersionedBytes()}.  To deserialize, call<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * {@link #parseVersionedServerName(byte[])}.<a name="line.50"></a>
-<span class="sourceLineNo">051</span> *<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * &lt;p&gt;Use {@link #getAddress()} to obtain the Server hostname + port<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * (Endpoint/Socket Address).<a name="line.53"></a>
-<span class="sourceLineNo">054</span> *<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;p&gt;Immutable.<a name="line.55"></a>
-<span class="sourceLineNo">056</span> */<a name="line.56"></a>
-<span class="sourceLineNo">057</span>@InterfaceAudience.Public<a name="line.57"></a>
-<span class="sourceLineNo">058</span>public class ServerName implements Comparable&lt;ServerName&gt;, Serializable {<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private static final long serialVersionUID = 1367463982557264981L;<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  /**<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * Version for this class.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * Its a short rather than a byte so I can for sure distinguish between this<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * version of this class and the version previous to this which did not have<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   * a version.<a name="line.65"></a>
-<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static final short VERSION = 0;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  static final byte [] VERSION_BYTES = Bytes.toBytes(VERSION);<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   * What to use if no startcode supplied.<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   */<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public static final int NON_STARTCODE = -1;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  /**<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * This character is used as separator between server hostname, port and<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * startcode.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   */<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String SERVERNAME_SEPARATOR = ",";<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  public static final Pattern SERVERNAME_PATTERN =<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    Pattern.compile("[^" + SERVERNAME_SEPARATOR + "]+" +<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX +<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX + "$");<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>   * What to use if server name is unknown.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   */<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final String UNKNOWN_SERVERNAME = "#unknown#";<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private final String servername;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private final long startcode;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private transient Address address;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * Cached versioned bytes of this ServerName instance.<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   * @see #getVersionedBytes()<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private byte [] bytes;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  public static final List&lt;ServerName&gt; EMPTY_SERVER_LIST = new ArrayList&lt;&gt;(0);<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  protected ServerName(final String hostname, final int port, final long startcode) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    this(Address.fromParts(hostname, port), startcode);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private ServerName(final Address address, final long startcode) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    // Use HostAndPort to host port and hostname. Does validation and can do ipv6<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    this.address = address;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    this.startcode = startcode;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    this.servername = getServerName(this.address.getHostname(),<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        this.address.getPort(), startcode);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  private ServerName(final String serverName) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    this(parseHostname(serverName), parsePort(serverName),<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      parseStartcode(serverName));<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private ServerName(final String hostAndPort, final long startCode) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    this(Address.fromString(hostAndPort), startCode);<a name="line.120"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>/**<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * Name of a particular incarnation of an HBase Server.<a name="line.38"></a>
+<span class="sourceLineNo">039</span> * A {@link ServerName} is used uniquely identifying a server instance in a cluster and is made<a name="line.39"></a>
+<span class="sourceLineNo">040</span> * of the combination of hostname, port, and startcode.  The startcode distinguishes restarted<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * servers on same hostname and port (startcode is usually timestamp of server startup). The<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * {@link #toString()} format of ServerName is safe to use in the  filesystem and as znode name<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * up in ZooKeeper.  Its format is:<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * &lt;code&gt;&amp;lt;hostname&amp;gt; '{@link #SERVERNAME_SEPARATOR}' &amp;lt;port&amp;gt;<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * '{@link #SERVERNAME_SEPARATOR}' &amp;lt;startcode&amp;gt;&lt;/code&gt;.<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * For example, if hostname is &lt;code&gt;www.example.org&lt;/code&gt;, port is &lt;code&gt;1234&lt;/code&gt;,<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * and the startcode for the regionserver is &lt;code&gt;1212121212&lt;/code&gt;, then<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * the {@link #toString()} would be &lt;code&gt;www.example.org,1234,1212121212&lt;/code&gt;.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> *<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * &lt;p&gt;You can obtain a versioned serialized form of this class by calling<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * {@link #getVersionedBytes()}.  To deserialize, call<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * {@link #parseVersionedServerName(byte[])}.<a name="line.52"></a>
+<span class="sourceLineNo">053</span> *<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * &lt;p&gt;Use {@link #getAddress()} to obtain the Server hostname + port<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * (Endpoint/Socket Address).<a name="line.55"></a>
+<span class="sourceLineNo">056</span> *<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * &lt;p&gt;Immutable.<a name="line.57"></a>
+<span class="sourceLineNo">058</span> */<a name="line.58"></a>
+<span class="sourceLineNo">059</span>@InterfaceAudience.Public<a name="line.59"></a>
+<span class="sourceLineNo">060</span>public class ServerName implements Comparable&lt;ServerName&gt;, Serializable {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private static final long serialVersionUID = 1367463982557264981L;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  /**<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * Version for this class.<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Its a short rather than a byte so I can for sure distinguish between this<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * version of this class and the version previous to this which did not have<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * a version.<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   */<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private static final short VERSION = 0;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  static final byte [] VERSION_BYTES = Bytes.toBytes(VERSION);<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * What to use if no startcode supplied.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  public static final int NON_STARTCODE = -1;<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  /**<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * This character is used as separator between server hostname, port and<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * startcode.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  public static final String SERVERNAME_SEPARATOR = ",";<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final Pattern SERVERNAME_PATTERN =<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    Pattern.compile("[^" + SERVERNAME_SEPARATOR + "]+" +<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX +<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      SERVERNAME_SEPARATOR + Addressing.VALID_PORT_REGEX + "$");<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  /**<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * What to use if server name is unknown.<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public static final String UNKNOWN_SERVERNAME = "#unknown#";<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private final String servername;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private final long startcode;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private transient Address address;<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  /**<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * Cached versioned bytes of this ServerName instance.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * @see #getVersionedBytes()<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private byte [] bytes;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public static final List&lt;ServerName&gt; EMPTY_SERVER_LIST = new ArrayList&lt;&gt;(0);<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  /**<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * Intern ServerNames. The Set of ServerNames is mostly-fixed changing slowly as Servers<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * restart. Rather than create a new instance everytime, try and return existing instance<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * if there is one.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private static final Interner&lt;ServerName&gt; INTERN_POOL = Interners.newWeakInterner();<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  protected ServerName(final String hostname, final int port, final long startcode) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    this(Address.fromParts(hostname, port), startcode);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  private ServerName(final Address address, final long startcode) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // Use HostAndPort to host port and hostname. Does validation and can do ipv6<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    this.address = address;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    this.startcode = startcode;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    this.servername = getServerName(this.address.getHostname(),<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        this.address.getPort(), startcode);<a name="line.120"></a>
 <span class="sourceLineNo">121</span>  }<a name="line.121"></a>
 <span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * @param hostname<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * @return hostname minus the domain, if there is one (will do pass-through on ip addresses)<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * @deprecated Since 2.0. This is for internal use only.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   */<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  @Deprecated<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  // Make this private in hbase-3.0.<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  static String getHostNameMinusDomain(final String hostname) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    if (InetAddresses.isInetAddress(hostname)) return hostname;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    String [] parts = hostname.split("\\.");<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    if (parts == null || parts.length == 0) return hostname;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    return parts[0];<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  /**<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  @Deprecated<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  // This is unused. Get rid of it.<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static String parseHostname(final String serverName) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    if (serverName == null || serverName.length() &lt;= 0) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      throw new IllegalArgumentException("Passed hostname is null or empty");<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    if (!Character.isLetterOrDigit(serverName.charAt(0))) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      throw new IllegalArgumentException("Bad passed hostname, serverName=" + serverName);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    int index = serverName.indexOf(SERVERNAME_SEPARATOR);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    return serverName.substring(0, index);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  @Deprecated<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  // This is unused. Get rid of it.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  public static int parsePort(final String serverName) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    String [] split = serverName.split(SERVERNAME_SEPARATOR);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    return Integer.parseInt(split[1]);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  @Deprecated<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  // This is unused. Get rid of it.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public static long parseStartcode(final String serverName) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    int index = serverName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    return Long.parseLong(serverName.substring(index + 1));<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  /**<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * Retrieve an instance of ServerName.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * Callers should use the equals method to compare returned instances, though we may return<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * a shared immutable object as an internal optimization.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  public static ServerName valueOf(final String hostname, final int port, final long startcode) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    return new ServerName(hostname, port, startcode);<a name="line.179"></a>
+<span class="sourceLineNo">123</span>  private ServerName(final String serverName) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this(parseHostname(serverName), parsePort(serverName),<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      parseStartcode(serverName));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private ServerName(final String hostAndPort, final long startCode) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    this(Address.fromString(hostAndPort), startCode);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  /**<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param hostname<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @return hostname minus the domain, if there is one (will do pass-through on ip addresses)<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @deprecated Since 2.0. This is for internal use only.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  @Deprecated<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  // Make this private in hbase-3.0.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  static String getHostNameMinusDomain(final String hostname) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    if (InetAddresses.isInetAddress(hostname)) return hostname;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    String [] parts = hostname.split("\\.");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    if (parts == null || parts.length == 0) return hostname;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return parts[0];<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  /**<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   */<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  @Deprecated<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // This is unused. Get rid of it.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  public static String parseHostname(final String serverName) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    if (serverName == null || serverName.length() &lt;= 0) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      throw new IllegalArgumentException("Passed hostname is null or empty");<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    if (!Character.isLetterOrDigit(serverName.charAt(0))) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      throw new IllegalArgumentException("Bad passed hostname, serverName=" + serverName);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    int index = serverName.indexOf(SERVERNAME_SEPARATOR);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    return serverName.substring(0, index);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   */<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @Deprecated<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  // This is unused. Get rid of it.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  public static int parsePort(final String serverName) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    String [] split = serverName.split(SERVERNAME_SEPARATOR);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return Integer.parseInt(split[1]);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * @deprecated Since 2.0. Use {@link #valueOf(String)}<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  @Deprecated<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  // This is unused. Get rid of it.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  public static long parseStartcode(final String serverName) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    int index = serverName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    return Long.parseLong(serverName.substring(index + 1));<a name="line.179"></a>
 <span class="sourceLineNo">180</span>  }<a name="line.180"></a>
 <span class="sourceLineNo">181</span><a name="line.181"></a>
 <span class="sourceLineNo">182</span>  /**<a name="line.182"></a>
@@ -192,8 +192,8 @@
 <span class="sourceLineNo">184</span>   * Callers should use the equals method to compare returned instances, though we may return<a name="line.184"></a>
 <span class="sourceLineNo">185</span>   * a shared immutable object as an internal optimization.<a name="line.185"></a>
 <span class="sourceLineNo">186</span>   */<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  public static ServerName valueOf(final String serverName) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    return new ServerName(serverName);<a name="line.188"></a>
+<span class="sourceLineNo">187</span>  public static ServerName valueOf(final String hostname, final int port, final long startcode) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    return INTERN_POOL.intern(new ServerName(hostname, port, startcode));<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>
@@ -201,230 +201,239 @@
 <span class="sourceLineNo">193</span>   * Callers should use the equals method to compare returned instances, though we may return<a name="line.193"></a>
 <span class="sourceLineNo">194</span>   * a shared immutable object as an internal optimization.<a name="line.194"></a>
 <span class="sourceLineNo">195</span>   */<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public static ServerName valueOf(final String hostAndPort, final long startCode) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return new ServerName(hostAndPort, startCode);<a name="line.197"></a>
+<span class="sourceLineNo">196</span>  public static ServerName valueOf(final String serverName) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    return INTERN_POOL.intern(new ServerName(serverName));<a name="line.197"></a>
 <span class="sourceLineNo">198</span>  }<a name="line.198"></a>
 <span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  @Override<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  public String toString() {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    return getServerName();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  /**<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @return Return a SHORT version of {@link ServerName#toString()}, one that has the host only,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * minus the domain, and the port only -- no start code; the String is for us internally mostly<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * tying threads to their server.  Not for external use.  It is lossy and will not work in<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   * in compares, etc.<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  public String toShortString() {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return Addressing.createHostAndPortStr(<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        getHostNameMinusDomain(this.address.getHostname()),<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        this.address.getPort());<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   * @return {@link #getServerName()} as bytes with a short-sized prefix with<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * the ServerName#VERSION of this class.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  public synchronized byte [] getVersionedBytes() {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    if (this.bytes == null) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      this.bytes = Bytes.add(VERSION_BYTES, Bytes.toBytes(getServerName()));<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    return this.bytes;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>  public String getServerName() {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    return servername;<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>  public String getHostname() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return this.address.getHostname();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public String getHostnameLowerCase() {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    return this.address.getHostname().toLowerCase(Locale.ROOT);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public int getPort() {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    return this.address.getPort();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  public long getStartcode() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    return startcode;<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>  /**<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * For internal use only.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * @param hostName<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @param port<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param startcode<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @return Server name made of the concatenation of hostname, port and<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * startcode formatted as &lt;code&gt;&amp;lt;hostname&amp;gt; ',' &amp;lt;port&amp;gt; ',' &amp;lt;startcode&amp;gt;&lt;/code&gt;<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @deprecated Since 2.0. Use {@link ServerName#valueOf(String, int, long)} instead.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   */<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  @Deprecated<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  // TODO: Make this private in hbase-3.0.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  static String getServerName(String hostName, int port, long startcode) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    final StringBuilder name = new StringBuilder(hostName.length() + 1 + 5 + 1 + 13);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    name.append(hostName.toLowerCase(Locale.ROOT));<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    name.append(SERVERNAME_SEPARATOR);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    name.append(port);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    name.append(SERVERNAME_SEPARATOR);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    name.append(startcode);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return name.toString();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * @param hostAndPort String in form of &amp;lt;hostname&amp;gt; ':' &amp;lt;port&amp;gt;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * @param startcode<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * @return Server name made of the concatenation of hostname, port and<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * startcode formatted as &lt;code&gt;&amp;lt;hostname&amp;gt; ',' &amp;lt;port&amp;gt; ',' &amp;lt;startcode&amp;gt;&lt;/code&gt;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * @deprecated Since 2.0. Use {@link ServerName#valueOf(String, long)} instead.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @Deprecated<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  public static String getServerName(final String hostAndPort,<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      final long startcode) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    int index = hostAndPort.indexOf(":");<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    if (index &lt;= 0) throw new IllegalArgumentException("Expected &lt;hostname&gt; ':' &lt;port&gt;");<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    return getServerName(hostAndPort.substring(0, index),<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      Integer.parseInt(hostAndPort.substring(index + 1)), startcode);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * @return Hostname and port formatted as described at<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * {@link Addressing#createHostAndPortStr(String, int)}<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * @deprecated Since 2.0. Use {@link #getAddress()} instead.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   */<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @Deprecated<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  public String getHostAndPort() {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    return this.address.toString();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  public Address getAddress() {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return this.address;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<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>   * @param serverName ServerName in form specified by {@link #getServerName()}<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * @return The server start code parsed from &lt;code&gt;servername&lt;/code&gt;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * @deprecated Since 2.0. Use instance of ServerName to pull out start code.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  @Deprecated<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public static long getServerStartcodeFromServerName(final String serverName) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    int index = serverName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    return Long.parseLong(serverName.substring(index + 1));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * Utility method to excise the start code from a server name<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * @param inServerName full server name<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @return server name less its start code<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @deprecated Since 2.0. Use {@link #getAddress()}<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  @Deprecated<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static String getServerNameLessStartCode(String inServerName) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    if (inServerName != null &amp;&amp; inServerName.length() &gt; 0) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      int index = inServerName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      if (index &gt; 0) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        return inServerName.substring(0, index);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    return inServerName;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>  @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  public int compareTo(ServerName other) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    int compare;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    if (other == null) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      return -1;<a name="line.331"></a>
+<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * Retrieve an instance of ServerName.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * Callers should use the equals method to compare returned instances, though we may return<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * a shared immutable object as an internal optimization.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public static ServerName valueOf(final String hostAndPort, final long startCode) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    return INTERN_POOL.intern(new ServerName(hostAndPort, startCode));<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>  @Override<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  public String toString() {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return getServerName();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @return Return a SHORT version of {@link ServerName#toString()}, one that has the host only,<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * minus the domain, and the port only -- no start code; the String is for us internally mostly<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * tying threads to their server.  Not for external use.  It is lossy and will not work in<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * in compares, etc.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   */<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  public String toShortString() {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    return Addressing.createHostAndPortStr(<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        getHostNameMinusDomain(this.address.getHostname()),<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        this.address.getPort());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @return {@link #getServerName()} as bytes with a short-sized prefix with<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * the ServerName#VERSION of this class.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  public synchronized byte [] getVersionedBytes() {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    if (this.bytes == null) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.bytes = Bytes.add(VERSION_BYTES, Bytes.toBytes(getServerName()));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    return this.bytes;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  public String getServerName() {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    return servername;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public String getHostname() {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    return this.address.getHostname();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  public String getHostnameLowerCase() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    return this.address.getHostname().toLowerCase(Locale.ROOT);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public int getPort() {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    return this.address.getPort();<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  public long getStartcode() {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return startcode;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * For internal use only.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @param hostName<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * @param port<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * @param startcode<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * @return Server name made of the concatenation of hostname, port and<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * startcode formatted as &lt;code&gt;&amp;lt;hostname&amp;gt; ',' &amp;lt;port&amp;gt; ',' &amp;lt;startcode&amp;gt;&lt;/code&gt;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * @deprecated Since 2.0. Use {@link ServerName#valueOf(String, int, long)} instead.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  @Deprecated<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  // TODO: Make this private in hbase-3.0.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  static String getServerName(String hostName, int port, long startcode) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    final StringBuilder name = new StringBuilder(hostName.length() + 1 + 5 + 1 + 13);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    name.append(hostName.toLowerCase(Locale.ROOT));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    name.append(SERVERNAME_SEPARATOR);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    name.append(port);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    name.append(SERVERNAME_SEPARATOR);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    name.append(startcode);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    return name.toString();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @param hostAndPort String in form of &amp;lt;hostname&amp;gt; ':' &amp;lt;port&amp;gt;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @param startcode<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * @return Server name made of the concatenation of hostname, port and<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * startcode formatted as &lt;code&gt;&amp;lt;hostname&amp;gt; ',' &amp;lt;port&amp;gt; ',' &amp;lt;startcode&amp;gt;&lt;/code&gt;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * @deprecated Since 2.0. Use {@link ServerName#valueOf(String, long)} instead.<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   */<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @Deprecated<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  public static String getServerName(final String hostAndPort,<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      final long startcode) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    int index = hostAndPort.indexOf(":");<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (index &lt;= 0) throw new IllegalArgumentException("Expected &lt;hostname&gt; ':' &lt;port&gt;");<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return getServerName(hostAndPort.substring(0, index),<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      Integer.parseInt(hostAndPort.substring(index + 1)), startcode);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * @return Hostname and port formatted as described at<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * {@link Addressing#createHostAndPortStr(String, int)}<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @deprecated Since 2.0. Use {@link #getAddress()} instead.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @Deprecated<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public String getHostAndPort() {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    return this.address.toString();<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public Address getAddress() {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    return this.address;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * @param serverName ServerName in form specified by {@link #getServerName()}<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * @return The server start code parsed from &lt;code&gt;servername&lt;/code&gt;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * @deprecated Since 2.0. Use instance of ServerName to pull out start code.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  @Deprecated<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public static long getServerStartcodeFromServerName(final String serverName) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    int index = serverName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    return Long.parseLong(serverName.substring(index + 1));<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  }<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>   * Utility method to excise the start code from a server name<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * @param inServerName full server name<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * @return server name less its start code<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * @deprecated Since 2.0. Use {@link #getAddress()}<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   */<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Deprecated<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public static String getServerNameLessStartCode(String inServerName) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (inServerName != null &amp;&amp; inServerName.length() &gt; 0) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      int index = inServerName.lastIndexOf(SERVERNAME_SEPARATOR);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (index &gt; 0) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        return inServerName.substring(0, index);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      }<a name="line.331"></a>
 <span class="sourceLineNo">332</span>    }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    if (this.getHostname() == null) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      if (other.getHostname() != null) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        return 1;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    } else {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      if (other.getHostname() == null) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        return -1;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      compare = this.getHostname().compareToIgnoreCase(other.getHostname());<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      if (compare != 0) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        return compare;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    compare = this.getPort() - other.getPort();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    if (compare != 0) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      return compare;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    return Long.compare(this.getStartcode(), other.getStartcode());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  @Override<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  public int hashCode() {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    return getServerName().hashCode();<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>  @Override<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public boolean equals(Object o) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    if (this == o) return true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    if (o == null) return false;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    if (!(o instanceof ServerName)) return false;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return this.compareTo((ServerName)o) == 0;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * @param left<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   * @param right<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * @return True if &lt;code&gt;other&lt;/code&gt; has same hostname and port.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public static boolean isSameAddress(final ServerName left,<a name="line.371"></a>
-<span class="sourceLineNo">372</span>                                      final ServerName right) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    // TODO: Make this left.getAddress().equals(right.getAddress())<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    if (left == null) return false;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    if (right == null) return false;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    return left.getHostname().compareToIgnoreCase(right.getHostname()) == 0 &amp;&amp;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      left.getPort() == right.getPort();<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>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Use this method instantiating a {@link ServerName} from bytes<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * gotten from a call to {@link #getVersionedBytes()}.  Will take care of the<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * case where bytes were written by an earlier version of hbase.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * @param versionedBytes Pass bytes gotten from a call to {@link #getVersionedBytes()}<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   * @return A ServerName instance.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * @see #getVersionedBytes()<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  public static ServerName parseVersionedServerName(final byte [] versionedBytes) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    // Version is a short.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    short version = Bytes.toShort(versionedBytes);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    if (version == VERSION) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      int length = versionedBytes.length - Bytes.SIZEOF_SHORT;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      return valueOf(Bytes.toString(versionedBytes, Bytes.SIZEOF_SHORT, length));<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    // Presume the bytes were written with an old version of hbase and that the<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // bytes are actually a String of the form "'&lt;hostname&gt;' ':' '&lt;port&gt;'".<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    return valueOf(Bytes.toString(versionedBytes), NON_STARTCODE);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  /**<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @param str Either an instance of {@link ServerName#toString()} or a<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * "'&amp;lt;hostname&amp;gt;' ':' '&amp;lt;port&amp;gt;'".<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @return A ServerName instance.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   */<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  public static ServerName parseServerName(final String str) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    return SERVERNAME_PATTERN.matcher(str).matches()? valueOf(str) :<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        valueOf(str, NON_STARTCODE);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  /**<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * @return true if the String follows the pattern of {@link ServerName#toString()}, false<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   *  otherwise.<a name="line.413"></a>
-<span class="sourceLineNo">414</span>   */<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  public static boolean isFullServerName(final String str){<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    if (str == null ||str.isEmpty()) return false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    return SERVERNAME_PATTERN.matcher(str).matches();<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">333</span>    return inServerName;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  @Override<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  public int compareTo(ServerName other) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    int compare;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (other == null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      return -1;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (this.getHostname() == null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      if (other.getHostname() != null) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        return 1;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    } else {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      if (other.getHostname() == null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        return -1;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      compare = this.getHostname().compareToIgnoreCase(other.getHostname());<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      if (compare != 0) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        return compare;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    compare = this.getPort() - other.getPort();<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    if (compare != 0) {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      return compare;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    return Long.compare(this.getStartcode(), other.getStartcode());<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Override<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public int hashCode() {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return getServerName().hashCode();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  }<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  @Override<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public boolean equals(Object o) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    if (this == o) return true;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    if (o == null) return false;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    if (!(o instanceof ServerName)) return false;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return this.compareTo((ServerName)o) == 0;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>  /**<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * @param left<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @param right<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @return True if &lt;code&gt;other&lt;/code&gt; has same hostname and port.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static boolean isSameAddress(final ServerName left,<a name="line.380"></a>
+<span class="sourceLineNo">381</span>                                      final ServerName right) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    // TODO: Make this left.getAddress().equals(right.getAddress())<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    if (left == null) return false;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    if (right == null) return false;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    return left.getHostname().compareToIgnoreCase(right.getHostname()) == 0 &amp;&amp;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      left.getPort() == right.getPort();<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   * Use this method instantiating a {@link ServerName} from bytes<a name="line.390"></a>
+<span class="sourceLineNo">391</span>   * gotten from a call to {@link #getVersionedBytes()}.  Will take care of the<a name="line.391"></a>
+<span class="sourceLineNo">392</span>   * case where bytes were written by an earlier version of hbase.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @param versionedBytes Pass bytes gotten from a call to {@link #getVersionedBytes()}<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @return A ServerName instance.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @see #getVersionedBytes()<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public static ServerName parseVersionedServerName(final byte [] versionedBytes) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    // Version is a short.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    short version = Bytes.toShort(versionedBytes);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    if (version == VERSION) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      int length = versionedBytes.length - Bytes.SIZEOF_SHORT;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      return valueOf(Bytes.toString(versionedBytes, Bytes.SIZEOF_SHORT, length));<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    // Presume the bytes were written with an old version of hbase and that the<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    // bytes are actually a String of the form "'&lt;hostname&gt;' ':' '&lt;port&gt;'".<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return valueOf(Bytes.toString(versionedBytes), NON_STARTCODE);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  /**<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param str Either an instance of {@link ServerName#toString()} or a<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   * "'&amp;lt;hostname&amp;gt;' ':' '&amp;lt;port&amp;gt;'".<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return A ServerName instance.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  public static ServerName parseServerName(final String str) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    return SERVERNAME_PATTERN.matcher(str).matches()? valueOf(str) :<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        valueOf(str, NON_STARTCODE);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<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 String follows the pattern of {@link ServerName#toString()}, false<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   *  otherwise.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  public static boolean isFullServerName(final String str){<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    if (str == null ||str.isEmpty()) return false;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return SERVERNAME_PATTERN.matcher(str).matches();<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 2e76d94..ef49246 100644
--- a/book.html
+++ b/book.html
@@ -40807,7 +40807,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-07-20 14:29:58 UTC
+Last updated 2018-07-22 09:10:24 UTC
 </div>
 </div>
 </body>

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


[26/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFromRegionLoadFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<s

<TRUNCATED>

[11/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.RegionReplicaRackCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line

<TRUNCATED>

[31/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html
index 5f41fe7..c8158b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.html
@@ -524,636 +524,639 @@
 <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><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      if (!node.getTable().equals(tableName)) break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      regions.add(node);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return regions;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      if (!node.getTable().equals(tableName)) break;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      regions.add(node.toRegionState());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return regions;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      if (!node.getTable().equals(tableName)) break;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      regions.add(node.getRegionInfo());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    return regions;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    return regionsMap.values();<a name="line.547"></a>
+<span class="sourceLineNo">519</span>  public void deleteRegions(final List&lt;RegionInfo&gt; regionInfos) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    regionInfos.forEach(this::deleteRegion);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (!node.getTable().equals(tableName)) break;<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      regions.add(node);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return regions;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (!node.getTable().equals(tableName)) break;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      regions.add(node.toRegionState());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return regions;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      if (!node.getTable().equals(tableName)) break;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      regions.add(node.getRegionInfo());<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return regions;<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      regions.add(node.toRegionState());<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return regions;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  RegionState helpers<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  // ==========================================================================<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        return node.toRegionState();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  // ============================================================================================<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  //  TODO: helpers<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  // ============================================================================================<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    // TODO<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  /**<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return getRegionsOfTable(table, false);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    synchronized (node) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      if (!include(node, false)) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      if (node.isInState(State.OPEN)) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          node.getOpenSeqNum());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      } else if (node.isInState(State.OPENING)) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      } else {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        return null;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Get the regions to be reopened when modifying a table.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * &lt;p/&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<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>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p/&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * &lt;p/&gt;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * &lt;ul&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;/ul&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @param oldLoc the previous state/location of this region<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   *         means we still need to reopen the region.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    synchronized (node) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        // in OPEN state before<a name="line.644"></a>
-<span class="sourceLineNo">645</span>        if (node.isInState(State.OPEN)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>            // normal case, the region has been reopened<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            return null;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          } else {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            // the open seq num does not change, need to reopen again<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              node.getOpenSeqNum());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        } else {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          // finished maybe, but not a problem).<a name="line.656"></a>
-<span class="sourceLineNo">657</span>          return null;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      } else {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        // in OPENING state before<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          // reopened(not finished maybe, but not a problem)<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          return null;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        } else {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>          }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          // is changed to OPEN.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   */<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   *         {@link State#SPLIT} state.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      .collect(Collectors.toList());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * weed out split and offline regions.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   */<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (LOG.isTraceEnabled()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Returns the set of regions hosted by the specified server<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * @param serverName the server we are interested in<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * @return set of RegionInfo hosted by the specified server<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    synchronized (serverInfo) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return serverInfo.getRegionInfoList();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  // ============================================================================================<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  // Split helpers<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  // the ServerStateNode by calling removeServer.<a name="line.730"></a>
+<span class="sourceLineNo">550</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return regionsMap.values();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      regions.add(node.toRegionState());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return regions;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>  // ==========================================================================<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  //  RegionState helpers<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  // ==========================================================================<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        return node.toRegionState();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    return null;<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>  //  TODO: helpers<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  // ============================================================================================<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // TODO<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return getRegionsOfTable(table, false);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    synchronized (node) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      if (!include(node, false)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        return null;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      if (node.isInState(State.OPEN)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          node.getOpenSeqNum());<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      } else if (node.isInState(State.OPENING)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        return null;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Get the regions to be reopened when modifying a table.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * &lt;p/&gt;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * &lt;p/&gt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * &lt;p/&gt;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;ul&gt;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param oldLoc the previous state/location of this region<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   *         means we still need to reopen the region.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    synchronized (node) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // in OPEN state before<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        if (node.isInState(State.OPEN)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>            // normal case, the region has been reopened<a name="line.651"></a>
+<span class="sourceLineNo">652</span>            return null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>          } else {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            // the open seq num does not change, need to reopen again<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.655"></a>
+<span class="sourceLineNo">656</span>              node.getOpenSeqNum());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        } else {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // finished maybe, but not a problem).<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          return null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      } else {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        // in OPENING state before<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          // reopened(not finished maybe, but not a problem)<a name="line.667"></a>
+<span class="sourceLineNo">668</span>          return null;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        } else {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>            return null;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          // is changed to OPEN.<a name="line.675"></a>
+<span class="sourceLineNo">676</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        }<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      }<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   */<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *         {@link State#SPLIT} state.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   */<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      .collect(Collectors.toList());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<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>   * Utility. Whether to include region in list of regions. Default is to<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * weed out split and offline regions.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   */<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    if (LOG.isTraceEnabled()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.713"></a>
+<span class="sourceLineNo">714</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<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>   * Returns the set of regions hosted by the specified server<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param serverName the server we are interested in<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return set of RegionInfo hosted by the specified server<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>    synchronized (serverInfo) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      return serverInfo.getRegionInfoList();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
 <span class="sourceLineNo">731</span>  // ============================================================================================<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    synchronized (serverNode) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      serverNode.setState(state);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @see #metaLogSplit(ServerName)<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    setServerState(serverName, ServerState.SPLITTING_META);<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>  /**<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * @see #metaLogSplitting(ServerName)<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public void metaLogSplit(ServerName serverName) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   * Call this when we start log splitting for a crashed Server.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @see #logSplit(ServerName)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  public void logSplitting(final ServerName serverName) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    setServerState(serverName, ServerState.SPLITTING);<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>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Called after we've split all logs on a crashed Server.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * @see #logSplitting(ServerName)<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  public void logSplit(final ServerName serverName) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    synchronized (regionNode) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      regionNode.setState(state);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  // ============================================================================================<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  //  TODO:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  // ============================================================================================<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      if (!node.isInTransition()) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        result.add(node.getRegionInfo());<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    return result;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (region != null) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      synchronized (region) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        return region.isInState(state);<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>    return false;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    for (RegionInfo hri: regions) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      if (node == null) continue;<a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>      // TODO: State.OPEN<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      final ServerName serverName = node.getRegionLocation();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (serverName == null) continue;<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      if (serverRegions == null) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        result.put(serverName, serverRegions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      serverRegions.add(node.getRegionInfo());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    }<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return result;<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>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return assignments;<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>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    final State[] states = State.values();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<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>    for (RegionStateNode node: regionsMap.values()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      if (node.getTable().equals(tableName)) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    return tableRegions;<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>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (region != null) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      synchronized (region) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        ServerName server = region.getRegionLocation();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        return server != null ? server : region.getLastHost();<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>    return null;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Can't let out original since it can change and at least the load balancer<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return A clone of current assignments by table.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      final boolean forceByCluster) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<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>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt;(1);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return result;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      if (tableResult == null) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        tableResult = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        result.put(node.getTable(), tableResult);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      final ServerName serverName = node.getRegionLocation();<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      if (serverName == null) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.info("Skipping, no server for " + node);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        continue;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      List&lt;RegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      if (serverResult == null) {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        serverResult = new ArrayList&lt;RegionInfo&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        tableResult.put(serverName, serverResult);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      serverResult.add(node.getRegionInfo());<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add online servers with no assignment for the table.<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; table: result.values()) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        for (ServerName svr : serverMap.keySet()) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          if (!table.containsKey(svr)) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>            table.put(svr, new ArrayList&lt;RegionInfo&gt;());<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          }<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>    return result;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  // ==========================================================================<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  //  Region in transition helpers<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  // ==========================================================================<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      final RegionTransitionProcedure procedure) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return true;<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>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      final RegionTransitionProcedure procedure) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    regionNode.unsetProcedure(procedure);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>  public boolean hasRegionsInTransition() {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    return !regionInTransition.isEmpty();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>  public boolean isRegionInTransition(final RegionInfo regionInfo) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return node != null ? node.isInTransition() : false;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   */<a name="line.957"></a>
-<span class="sourceLineNo">958</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final RegionInfo hri) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (node == null) return null;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    return node.getProcedure();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
-<span class="sourceLineNo">963</span><a name="line.963"></a>
-<span class="sourceLineNo">964</span>  public RegionState getRegionTransitionState(final RegionInfo hri) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    if (node == null) return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>    synchronized (node) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      return node.isInTransition() ? node.toRegionState() : null;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>  /**<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * Get the number of regions in transition.<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  public int getRegionsInTransitionCount() {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    return regionInTransition.size();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>  }<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      rit.add(node.toRegionState());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    return rit;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      rit.add(node.toRegionState());<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return rit;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  //  Region offline helpers<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  // TODO: Unused.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public void removeFromOfflineRegions(final RegionInfo regionInfo) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    regionOffline.remove(regionInfo);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span><a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>  // ==========================================================================<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  //  Region FAIL_OPEN helpers<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  // ==========================================================================<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  public static final class RegionFailedOpen {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private final RegionStateNode regionNode;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    private volatile Exception exception = null;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    private AtomicInteger retries = new AtomicInteger();<a name="line.1021"></a>
+<span class="sourceLineNo">732</span>  // Split helpers<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  // the ServerStateNode by calling removeServer.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>  // ============================================================================================<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    synchronized (serverNode) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      serverNode.setState(state);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @see #metaLogSplit(ServerName)<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   */<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    setServerState(serverName, ServerState.SPLITTING_META);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @see #metaLogSplitting(ServerName)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public void metaLogSplit(ServerName serverName) {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * Call this when we start log splitting for a crashed Server.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @see #logSplit(ServerName)<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public void logSplitting(final ServerName serverName) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    setServerState(serverName, ServerState.SPLITTING);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  /**<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * Called after we've split all logs on a crashed Server.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * @see #logSplitting(ServerName)<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  public void logSplit(final ServerName serverName) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    synchronized (regionNode) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      regionNode.setState(state);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    }<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>  // ============================================================================================<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  //  TODO:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  // ============================================================================================<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      if (!node.isInTransition()) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        result.add(node.getRegionInfo());<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    return result;<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    if (region != null) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      synchronized (region) {<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        return region.isInState(state);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return false;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return isRegionInState(regionInfo, State.OPEN);<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionInfo hri: regions) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (node == null) continue;<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      // TODO: State.OPEN<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      final ServerName serverName = node.getRegionLocation();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      if (serverName == null) continue;<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (serverRegions == null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        result.put(serverName, serverRegions);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      serverRegions.add(node.getRegionInfo());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    return result;<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    return assignments;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    final State[] states = State.values();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      if (node.getTable().equals(tableName)) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<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>    return tableRegions;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    if (region != null) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      synchronized (region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        ServerName server = region.getRegionLocation();<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        return server != null ? server : region.getLastHost();<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      }<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    return null;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * Can't let out original since it can change and at least the load balancer<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * @return A clone of current assignments by table.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      final boolean forceByCluster) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.893"></a>
+<span class="

<TRUNCATED>

[10/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
index 233dba3..91b9055 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.ServerLocalityCostFunction.html
@@ -540,1205 +540,1204 @@
 <span class="sourceLineNo">532</span>      sm.getRegionMetrics().forEach((byte[] regionName, RegionMetrics rm) -&gt; {<a name="line.532"></a>
 <span class="sourceLineNo">533</span>        Deque&lt;BalancerRegionLoad&gt; rLoads = oldLoads.get(Bytes.toString(regionName));<a name="line.533"></a>
 <span class="sourceLineNo">534</span>        if (rLoads == null) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // There was nothing there<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          rLoads = new ArrayDeque&lt;&gt;();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        } else if (rLoads.size() &gt;= numRegionLoadsToRemember) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          rLoads.remove();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        rLoads.add(new BalancerRegionLoad(rm));<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        loads.put(Bytes.toString(regionName), rLoads);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      });<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>    for(CostFromRegionLoadFunction cost : regionLoadFunctions) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      cost.setLoads(loads);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  protected void initCosts(Cluster cluster) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    for (CostFunction c:costFunctions) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      c.init(cluster);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  protected void updateCostsWithAction(Cluster cluster, Action action) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    for (CostFunction c : costFunctions) {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      c.postAction(action);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  /**<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   * Get the names of the cost functions<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   */<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public String[] getCostFunctionNames() {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (costFunctions == null) return null;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    String[] ret = new String[costFunctions.length];<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      CostFunction c = costFunctions[i];<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      ret[i] = c.getClass().getSimpleName();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    }<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return ret;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /**<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * This is the main cost function.  It will compute a cost associated with a proposed cluster<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * state.  All different costs will be combined with their multipliers to produce a double cost.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   *<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param cluster The state of the cluster<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param previousCost the previous cost. This is used as an early out.<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return a double of a cost associated with the proposed cluster state.  This cost is an<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   *         aggregate of all individual cost functions.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   */<a name="line.584"></a>
-<span class="sourceLineNo">585</span>  protected double computeCost(Cluster cluster, double previousCost) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    double total = 0;<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    for (int i = 0; i &lt; costFunctions.length; i++) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      CostFunction c = costFunctions[i];<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      this.tempFunctionCosts[i] = 0.0;<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      if (c.getMultiplier() &lt;= 0) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        continue;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>      Float multiplier = c.getMultiplier();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Double cost = c.cost();<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>      this.tempFunctionCosts[i] = multiplier*cost;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      total += this.tempFunctionCosts[i];<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>      if (total &gt; previousCost) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        break;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>    return total;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  /** Generates a candidate action to be applied to the cluster for cost function search */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  abstract static class CandidateGenerator {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    abstract Cluster.Action generate(Cluster cluster);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    /**<a name="line.614"></a>
-<span class="sourceLineNo">615</span>     * From a list of regions pick a random one. Null can be returned which<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * {@link StochasticLoadBalancer#balanceCluster(Map)} recognize as signal to try a region move<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     * rather than swap.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>     *<a name="line.618"></a>
-<span class="sourceLineNo">619</span>     * @param cluster        The state of the cluster<a name="line.619"></a>
-<span class="sourceLineNo">620</span>     * @param server         index of the server<a name="line.620"></a>
-<span class="sourceLineNo">621</span>     * @param chanceOfNoSwap Chance that this will decide to try a move rather<a name="line.621"></a>
-<span class="sourceLineNo">622</span>     *                       than a swap.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return a random {@link RegionInfo} or null if an asymmetrical move is<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     *         suggested.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>     */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    protected int pickRandomRegion(Cluster cluster, int server, double chanceOfNoSwap) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      // Check to see if this is just a move.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      if (cluster.regionsPerServer[server].length == 0 || RANDOM.nextFloat() &lt; chanceOfNoSwap) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // signal a move only.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        return -1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      int rand = RANDOM.nextInt(cluster.regionsPerServer[server].length);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      return cluster.regionsPerServer[server][rand];<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    protected int pickRandomServer(Cluster cluster) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      if (cluster.numServers &lt; 1) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        return -1;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      return RANDOM.nextInt(cluster.numServers);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    protected int pickRandomRack(Cluster cluster) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      if (cluster.numRacks &lt; 1) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        return -1;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      }<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return RANDOM.nextInt(cluster.numRacks);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>    protected int pickOtherRandomServer(Cluster cluster, int serverIndex) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      if (cluster.numServers &lt; 2) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        return -1;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      while (true) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        int otherServerIndex = pickRandomServer(cluster);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        if (otherServerIndex != serverIndex) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>          return otherServerIndex;<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>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    protected int pickOtherRandomRack(Cluster cluster, int rackIndex) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      if (cluster.numRacks &lt; 2) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>        return -1;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      while (true) {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        int otherRackIndex = pickRandomRack(cluster);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (otherRackIndex != rackIndex) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          return otherRackIndex;<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>    }<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    protected Cluster.Action pickRandomRegions(Cluster cluster,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>                                                       int thisServer,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                                                       int otherServer) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      if (thisServer &lt; 0 || otherServer &lt; 0) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        return Cluster.NullAction;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // Decide who is most likely to need another region<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      int thisRegionCount = cluster.getNumRegions(thisServer);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int otherRegionCount = cluster.getNumRegions(otherServer);<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // Assign the chance based upon the above<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      double thisChance = (thisRegionCount &gt; otherRegionCount) ? 0 : 0.5;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      double otherChance = (thisRegionCount &lt;= otherRegionCount) ? 0 : 0.5;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>      int thisRegion = pickRandomRegion(cluster, thisServer, thisChance);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      int otherRegion = pickRandomRegion(cluster, otherServer, otherChance);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return getAction(thisServer, thisRegion, otherServer, otherRegion);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    protected Cluster.Action getAction(int fromServer, int fromRegion,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>        int toServer, int toRegion) {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      if (fromServer &lt; 0 || toServer &lt; 0) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        return Cluster.NullAction;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (fromRegion &gt; 0 &amp;&amp; toRegion &gt; 0) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        return new Cluster.SwapRegionsAction(fromServer, fromRegion,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>          toServer, toRegion);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      } else if (fromRegion &gt; 0) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        return new Cluster.MoveRegionAction(fromRegion, fromServer, toServer);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      } else if (toRegion &gt; 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        return new Cluster.MoveRegionAction(toRegion, toServer, fromServer);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      } else {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        return Cluster.NullAction;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>    /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>     * Returns a random iteration order of indexes of an array with size length<a name="line.715"></a>
-<span class="sourceLineNo">716</span>     */<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    protected List&lt;Integer&gt; getRandomIterationOrder(int length) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      ArrayList&lt;Integer&gt; order = new ArrayList&lt;&gt;(length);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      for (int i = 0; i &lt; length; i++) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        order.add(i);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Collections.shuffle(order);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return order;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  static class RandomCandidateGenerator extends CandidateGenerator {<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>    @Override<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    Cluster.Action generate(Cluster cluster) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>      int thisServer = pickRandomServer(cluster);<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>      // Pick the other server<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.735"></a>
-<span class="sourceLineNo">736</span><a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>  }<a name="line.739"></a>
-<span class="sourceLineNo">740</span><a name="line.740"></a>
-<span class="sourceLineNo">741</span>  static class LoadCandidateGenerator extends CandidateGenerator {<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>    @Override<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Cluster.Action generate(Cluster cluster) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      cluster.sortServersByRegionCount();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      int thisServer = pickMostLoadedServer(cluster, -1);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      int otherServer = pickLeastLoadedServer(cluster, thisServer);<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private int pickLeastLoadedServer(final Cluster cluster, int thisServer) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      int index = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        index++;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        if (index == servers.length) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          return -1;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return servers[index];<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    private int pickMostLoadedServer(final Cluster cluster, int thisServer) {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Integer[] servers = cluster.serverIndicesSortedByRegionCount;<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>      int index = servers.length - 1;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      while (servers[index] == null || servers[index] == thisServer) {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        index--;<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        if (index &lt; 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>          return -1;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        }<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      }<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      return servers[index];<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  static class LocalityBasedCandidateGenerator extends CandidateGenerator {<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private MasterServices masterServices;<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>    LocalityBasedCandidateGenerator(MasterServices masterServices) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.masterServices = masterServices;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>    @Override<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    Cluster.Action generate(Cluster cluster) {<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      if (this.masterServices == null) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        int thisServer = pickRandomServer(cluster);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        // Pick the other server<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        int otherServer = pickOtherRandomServer(cluster, thisServer);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>        return pickRandomRegions(cluster, thisServer, otherServer);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>      // Randomly iterate through regions until you find one that is not on ideal host<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (int region : getRandomIterationOrder(cluster.numRegions)) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        int currentServer = cluster.regionIndexToServerIndex[region];<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        if (currentServer != cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          Optional&lt;Action&gt; potential = tryMoveOrSwap(<a name="line.800"></a>
-<span class="sourceLineNo">801</span>              cluster,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>              currentServer,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>              region,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>              cluster.getOrComputeRegionsToMostLocalEntities(LocalityType.SERVER)[region]<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          );<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          if (potential.isPresent()) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>            return potential.get();<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>      return Cluster.NullAction;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>    /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>     * Try to generate a move/swap fromRegion between fromServer and toServer such that locality is improved.<a name="line.815"></a>
-<span class="sourceLineNo">816</span>     * Returns empty optional if no move can be found<a name="line.816"></a>
-<span class="sourceLineNo">817</span>     */<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    private Optional&lt;Action&gt; tryMoveOrSwap(Cluster cluster,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>                                           int fromServer,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>                                           int fromRegion,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                                           int toServer) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // Try move first. We know apriori fromRegion has the highest locality on toServer<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (cluster.serverHasTooFewRegions(toServer)) {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        return Optional.of(getAction(fromServer, fromRegion, toServer, -1));<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // Compare locality gain/loss from swapping fromRegion with regions on toServer<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      double fromRegionLocalityDelta =<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          getWeightedLocality(cluster, fromRegion, toServer) - getWeightedLocality(cluster, fromRegion, fromServer);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      for (int toRegionIndex : getRandomIterationOrder(cluster.regionsPerServer[toServer].length)) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        int toRegion = cluster.regionsPerServer[toServer][toRegionIndex];<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        double toRegionLocalityDelta =<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            getWeightedLocality(cluster, toRegion, fromServer) - getWeightedLocality(cluster, toRegion, toServer);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        // If locality would remain neutral or improve, attempt the swap<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        if (fromRegionLocalityDelta + toRegionLocalityDelta &gt;= 0) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>          return Optional.of(getAction(fromServer, fromRegion, toServer, toRegion));<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>      return Optional.absent();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    private double getWeightedLocality(Cluster cluster, int region, int server) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      return cluster.getOrComputeWeightedLocality(region, server, LocalityType.SERVER);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    void setServices(MasterServices services) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      this.masterServices = services;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<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>   * Generates candidates which moves the replicas out of the region server for<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * co-hosted region replicas<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  static class RegionReplicaCandidateGenerator extends CandidateGenerator {<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>    RandomCandidateGenerator randomGenerator = new RandomCandidateGenerator();<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>     * Randomly select one regionIndex out of all region replicas co-hosted in the same group<a name="line.861"></a>
-<span class="sourceLineNo">862</span>     * (a group is a server, host or rack)<a name="line.862"></a>
-<span class="sourceLineNo">863</span>     * @param primariesOfRegionsPerGroup either Cluster.primariesOfRegionsPerServer,<a name="line.863"></a>
-<span class="sourceLineNo">864</span>     * primariesOfRegionsPerHost or primariesOfRegionsPerRack<a name="line.864"></a>
-<span class="sourceLineNo">865</span>     * @param regionsPerGroup either Cluster.regionsPerServer, regionsPerHost or regionsPerRack<a name="line.865"></a>
-<span class="sourceLineNo">866</span>     * @param regionIndexToPrimaryIndex Cluster.regionsIndexToPrimaryIndex<a name="line.866"></a>
-<span class="sourceLineNo">867</span>     * @return a regionIndex for the selected primary or -1 if there is no co-locating<a name="line.867"></a>
-<span class="sourceLineNo">868</span>     */<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    int selectCoHostedRegionPerGroup(int[] primariesOfRegionsPerGroup, int[] regionsPerGroup<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        , int[] regionIndexToPrimaryIndex) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      int currentPrimary = -1;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      int currentPrimaryIndex = -1;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      int selectedPrimaryIndex = -1;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      double currentLargestRandom = -1;<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // primariesOfRegionsPerGroup is a sorted array. Since it contains the primary region<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // ids for the regions hosted in server, a consecutive repetition means that replicas<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      // are co-hosted<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      for (int j = 0; j &lt;= primariesOfRegionsPerGroup.length; j++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        int primary = j &lt; primariesOfRegionsPerGroup.length<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            ? primariesOfRegionsPerGroup[j] : -1;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        if (primary != currentPrimary) { // check for whether we see a new primary<a name="line.881"></a>
-<span class="sourceLineNo">882</span>          int numReplicas = j - currentPrimaryIndex;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>          if (numReplicas &gt; 1) { // means consecutive primaries, indicating co-location<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            // decide to select this primary region id or not<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            double currentRandom = RANDOM.nextDouble();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>            // we don't know how many region replicas are co-hosted, we will randomly select one<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            // using reservoir sampling (http://gregable.com/2007/10/reservoir-sampling.html)<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            if (currentRandom &gt; currentLargestRandom) {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>              selectedPrimaryIndex = currentPrimary;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>              currentLargestRandom = currentRandom;<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>          }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          currentPrimary = primary;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>          currentPrimaryIndex = j;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>      // we have found the primary id for the region to move. Now find the actual regionIndex<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      // with the given primary, prefer to move the secondary region.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (int j = 0; j &lt; regionsPerGroup.length; j++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        int regionIndex = regionsPerGroup[j];<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        if (selectedPrimaryIndex == regionIndexToPrimaryIndex[regionIndex]) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          // always move the secondary, not the primary<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          if (selectedPrimaryIndex != regionIndex) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            return regionIndex;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      return -1;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>    @Override<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    Cluster.Action generate(Cluster cluster) {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      int serverIndex = pickRandomServer(cluster);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      if (cluster.numServers &lt;= 1 || serverIndex == -1) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        return Cluster.NullAction;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        cluster.primariesOfRegionsPerServer[serverIndex],<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        cluster.regionsPerServer[serverIndex],<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        cluster.regionIndexToPrimaryIndex);<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (regionIndex == -1) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        // default to randompicker<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        return randomGenerator.generate(cluster);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      }<a name="line.928"></a>
-<span class="sourceLineNo">929</span><a name="line.929"></a>
-<span class="sourceLineNo">930</span>      int toServerIndex = pickOtherRandomServer(cluster, serverIndex);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>  /**<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * Generates candidates which moves the replicas out of the rack for<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   * co-hosted region replicas in the same rack<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  static class RegionReplicaRackCandidateGenerator extends RegionReplicaCandidateGenerator {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    @Override<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    Cluster.Action generate(Cluster cluster) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      int rackIndex = pickRandomRack(cluster);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (cluster.numRacks &lt;= 1 || rackIndex == -1) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        return super.generate(cluster);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>      int regionIndex = selectCoHostedRegionPerGroup(<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        cluster.primariesOfRegionsPerRack[rackIndex],<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        cluster.regionsPerRack[rackIndex],<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        cluster.regionIndexToPrimaryIndex);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      // if there are no pairs of region replicas co-hosted, default to random generator<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      if (regionIndex == -1) {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // default to randompicker<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        return randomGenerator.generate(cluster);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      }<a name="line.957"></a>
-<span class="sourceLineNo">958</span><a name="line.958"></a>
-<span class="sourceLineNo">959</span>      int serverIndex = cluster.regionIndexToServerIndex[regionIndex];<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      int toRackIndex = pickOtherRandomRack(cluster, rackIndex);<a name="line.960"></a>
-<span class="sourceLineNo">961</span><a name="line.961"></a>
-<span class="sourceLineNo">962</span>      int rand = RANDOM.nextInt(cluster.serversPerRack[toRackIndex].length);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      int toServerIndex = cluster.serversPerRack[toRackIndex][rand];<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      int toRegionIndex = pickRandomRegion(cluster, toServerIndex, 0.9f);<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      return getAction(serverIndex, regionIndex, toServerIndex, toRegionIndex);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>  }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>  /**<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   * Base class of StochasticLoadBalancer's Cost Functions.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   */<a name="line.971"></a>
-<span class="sourceLineNo">972</span>  abstract static class CostFunction {<a name="line.972"></a>
-<span class="sourceLineNo">973</span><a name="line.973"></a>
-<span class="sourceLineNo">974</span>    private float multiplier = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>    protected Cluster cluster;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    CostFunction(Configuration c) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    }<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>    boolean isNeeded() {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      return true;<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    float getMultiplier() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      return multiplier;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>    void setMultiplier(float m) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.multiplier = m;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    /** Called once per LB invocation to give the cost function<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     * to initialize it's state, and perform any costly calculation.<a name="line.993"></a>
-<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    void init(Cluster cluster) {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>      this.cluster = cluster;<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>    /** Called once per cluster Action to give the cost function<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>     * an opportunity to update it's state. postAction() is always<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>     * called at least once before cost() is called with the cluster<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>     * that this action is performed on. */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    void postAction(Action action) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      switch (action.type) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      case NULL: break;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      case ASSIGN_REGION:<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        AssignRegionAction ar = (AssignRegionAction) action;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>        regionMoved(ar.region, -1, ar.server);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        break;<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      case MOVE_REGION:<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>        MoveRegionAction mra = (MoveRegionAction) action;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        regionMoved(mra.region, mra.fromServer, mra.toServer);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        break;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      case SWAP_REGIONS:<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        SwapRegionsAction a = (SwapRegionsAction) action;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        regionMoved(a.fromRegion, a.fromServer, a.toServer);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        regionMoved(a.toRegion, a.toServer, a.fromServer);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        break;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>      default:<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>        throw new RuntimeException("Uknown action:" + action.type);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span><a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    abstract double cost();<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    /**<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     * Function to compute a scaled cost using {@link org.apache.commons.math3.stat.descriptive.DescriptiveStatistics}.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>     * It assumes that this is a zero sum set of costs.  It assumes that the worst case<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>     * possible is all of the elements in one region server and the rest having 0.<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>     *<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>     * @param stats the costs<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>     * @return a scaled set of costs.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>     */<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    protected double costFromArray(double[] stats) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      double totalCost = 0;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      double total = getSum(stats);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span><a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      double count = stats.length;<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      double mean = total/count;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span><a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      // Compute max as if all region servers had 0 and one had the sum of all costs.  This must be<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>      // a zero sum cost for this to make sense.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      double max = ((count - 1) * mean) + (total - mean);<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span><a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      // It's possible that there aren't enough regions to go around<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      double min;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      if (count &gt; total) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        min = ((count - total) * mean) + ((1 - mean) * total);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      } else {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        // Some will have 1 more than everything else.<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        int numHigh = (int) (total - (Math.floor(mean) * count));<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>        int numLow = (int) (count - numHigh);<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span><a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        min = (numHigh * (Math.ceil(mean) - mean)) + (numLow * (mean - Math.floor(mean)));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span><a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      }<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      min = Math.max(0, min);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      for (int i=0; i&lt;stats.length; i++) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        double n = stats[i];<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        double diff = Math.abs(mean - n);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        totalCost += diff;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      double scaled =  scale(min, max, totalCost);<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      return scaled;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span><a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    private double getSum(double[] stats) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      double total = 0;<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      for(double s:stats) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        total += s;<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      return total;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    /**<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>     * Scale the value between 0 and 1.<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>     *<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>     * @param min   Min value<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>     * @param max   The Max value<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>     * @param value The value to be scaled.<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>     * @return The scaled value.<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>     */<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    protected double scale(double min, double max, double value) {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (max &lt;= min || value &lt;= min) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        return 0;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if ((max - min) == 0) return 0;<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      return Math.max(0d, Math.min(1d, (value - min) / (max - min)));<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>  }<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>   * Given the starting state of the regions and a potential ending state<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>   * compute cost based upon the number of regions that have moved.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>   */<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>  static class MoveCostFunction extends CostFunction {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    private static final String MOVE_COST_KEY = "hbase.master.balancer.stochastic.moveCost";<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    private static final String MAX_MOVES_PERCENT_KEY =<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>        "hbase.master.balancer.stochastic.maxMovePercent";<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    private static final float DEFAULT_MOVE_COST = 7;<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    private static final int DEFAULT_MAX_MOVES = 600;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    private static final float DEFAULT_MAX_MOVE_PERCENT = 0.25f;<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    private final float maxMovesPercent;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    MoveCostFunction(Configuration conf) {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      super(conf);<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span><a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      // Move cost multiplier should be the same cost or higher than the rest of the costs to ensure<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>      // that large benefits are need to overcome the cost of a move.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST));<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      // What percent of the number of regions a single run of the balancer can move.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT);<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span><a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    @Override<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    double cost() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      // Try and size the max number of Moves, but always be prepared to move some.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>      int maxMoves = Math.max((int) (cluster.numRegions * maxMovesPercent),<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          DEFAULT_MAX_MOVES);<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      double moveCost = cluster.numMovedRegions;<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span><a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      // Don't let this single balance move more than the max moves.<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      // This allows better scaling to accurately represent the actual cost of a move.<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>      if (moveCost &gt; maxMoves) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>        return 1000000;   // return a number much greater than any of the other cost<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>      return scale(0, Math.min(cluster.numRegions, maxMoves), moveCost);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>  }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>  /**<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>   * regions on a cluster.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   */<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>  static class RegionCountSkewCostFunction extends CostFunction {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>    private static final String REGION_COUNT_SKEW_COST_KEY =<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>        "hbase.master.balancer.stochastic.regionCountCost";<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    private static final float DEFAULT_REGION_COUNT_SKEW_COST = 500;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    private double[] stats = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span><a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    RegionCountSkewCostFunction(Configuration conf) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>      super(conf);<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      // Load multiplier should be the greatest as it is the most general way to balance data.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      this.setMultiplier(conf.getFloat(REGION_COUNT_SKEW_COST_KEY, DEFAULT_REGION_COUNT_SKEW_COST));<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    @Override<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    double cost() {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>        stats = new double[cluster.numServers];<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      }<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      for (int i =0; i &lt; cluster.numServers; i++) {<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>        stats[i] = cluster.regionsPerServer[i].length;<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span><a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      return costFromArray(stats);<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>  }<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span><a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>  /**<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>   * Compute the cost of a potential cluster state from skew in number of<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>   * primary regions on a cluster.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>   */<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>  static class PrimaryRegionCountSkewCostFunction extends CostFunction {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    private static final String PRIMARY_REGION_COUNT_SKEW_COST_KEY =<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>        "hbase.master.balancer.stochastic.primaryRegionCountCost";<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    private static final float DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST = 500;<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    private double[] stats = null;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span><a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    PrimaryRegionCountSkewCostFunction(Configuration conf) {<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>      super(conf);<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      // Load multiplier should be the greatest as primary regions serve majority of reads/writes.<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      this.setMultiplier(conf.getFloat(PRIMARY_REGION_COUNT_SKEW_COST_KEY,<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>        DEFAULT_PRIMARY_REGION_COUNT_SKEW_COST));<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    }<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span><a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    @Override<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    double cost() {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      if (!cluster.hasRegionReplicas) {<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>        return 0;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      }<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        stats = new double[cluster.numServers];<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>      }<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span><a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>      for (int i = 0; i &lt; cluster.numServers; i++) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        stats[i] = 0;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        for (int regionIdx : cluster.regionsPerServer[i]) {<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (regionIdx == cluster.regionIndexToPrimaryIndex[regionIdx]) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            stats[i]++;<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          }<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        }<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>      return costFromArray(stats);<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>    }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>  }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>  /**<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>   * Compute the cost of a potential cluster configuration based upon how evenly<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   * distributed tables are.<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>   */<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>  static class TableSkewCostFunction extends CostFunction {<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span><a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    private static final String TABLE_SKEW_COST_KEY =<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        "hbase.master.balancer.stochastic.tableSkewCost";<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    private static final float DEFAULT_TABLE_SKEW_COST = 35;<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span><a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    TableSkewCostFunction(Configuration conf) {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      super(conf);<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      this.setMultiplier(conf.getFloat(TABLE_SKEW_COST_KEY, DEFAULT_TABLE_SKEW_COST));<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>    }<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    @Override<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    double cost() {<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      double max = cluster.numRegions;<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      double min = ((double) cluster.numRegions) / cluster.numServers;<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      double value = 0;<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      for (int i = 0; i &lt; cluster.numMaxRegionsPerTable.length; i++) {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>        value += cluster.numMaxRegionsPerTable[i];<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>      return scale(min, max, value);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>  }<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span><a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>  /**<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>   * Compute a cost of a potential cluster configuration based upon where<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>   * {@link org.apache.hadoop.hbase.regionserver.HStoreFile}s are located.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   */<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  static abstract class LocalityBasedCostFunction extends CostFunction {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span><a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>    private final LocalityType type;<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span><a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    private double bestLocality; // best case locality across cluster weighted by local data size<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    private double locality; // current locality across cluster weighted by local data size<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span><a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    private MasterServices services;<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    LocalityBasedCostFunction(Configuration conf,<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>                              MasterServices srv,<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>                              LocalityType type,<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>                              String localityCostKey,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>                              float defaultLocalityCost) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      super(conf);<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>      this.type = type;<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>      this.setMultiplier(conf.getFloat(localityCostKey, defaultLocalityCost));<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>      this.services = srv;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>      this.locality = 0.0;<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>      this.bestLocality = 0.0;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    }<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span><a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    /**<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>     * Maps region to the current entity (server or rack) on which it is stored<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>     */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    abstract int regionIndexToEntityIndex(int region);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    public void setServices(MasterServices srvc) {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      this.services = srvc;<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>    @Override<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    void init(Cluster cluster) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>      super.init(cluster);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      locality = 0.0;<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>      bestLocality = 0.0;<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // If no master, no computation will work, so assume 0 cost<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      if (this.services == null) {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>        return;<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      }<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span><a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      for (int region = 0; region &lt; cluster.numRegions; region++) {<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        locality += getWeightedLocality(region, regionIndexToEntityIndex(region));<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>        bestLocality += getWeightedLocality(region, getMostLocalEntityForRegion(region));<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span><a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      // We normalize locality to be a score between 0 and 1.0 representing how good it<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      // is compared to how good it could be. If bestLocality is 0, assume locality is 100<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      // (and the cost is 0)<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      locality = bestLocality == 0 ? 1.0 : locality / bestLocality;<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    @Override<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>    protected void regionMoved(int region, int oldServer, int newServer) {<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      int oldEntity = type == LocalityType.SERVER ? oldServer : cluster.serverIndexToRackIndex[oldServer];<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      int newEntity = type == LocalityType.SERVER ? newServer : cluster.serverIndexToRackIndex[newServer];<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      if (this.services == null) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>        return;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      }<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      double localityDelta = getWeightedLocality(region, newEntity) - getWeightedLocality(region, oldEntity);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      double normalizedDelta = bestLocality == 0 ? 0.0 : localityDelta / bestLocality;<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>      locality += normalizedDelta;<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    @Override<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    double cost() {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return 1 - locality;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private int getMostLocalEntityForRegion(int region) {<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>      return cluster.getOrComputeRegionsToMostLocalEntities(type)[region];<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    }<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span><a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    private double getWeightedLocality(int region, int entity) {<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>      return cluster.getOrComputeWeightedLocality(region, entity, type);<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    }<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>  static class ServerLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span><a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private static final String LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.localityCost";<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private static final float DEFAULT_LOCALITY_COST = 25;<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    ServerLocalityCostFunction(Configuration conf, MasterServices srv) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          conf,<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          srv,<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>          LocalityType.SERVER,<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          LOCALITY_COST_KEY,<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          DEFAULT_LOCALITY_COST<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      );<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span><a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    @Override<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    int regionIndexToEntityIndex(int region) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>      return cluster.regionIndexToServerIndex[region];<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><a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  static class RackLocalityCostFunction extends LocalityBasedCostFunction {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span><a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    private static final String RACK_LOCALITY_COST_KEY = "hbase.master.balancer.stochastic.rackLocalityCost";<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    private static final float DEFAULT_RACK_LOCALITY_COST = 15;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span><a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    public RackLocalityCostFunction(Configuration conf, MasterServices services) {<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      super(<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>          conf,<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>          services,<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>          LocalityType.RACK,<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>          RACK_LOCALITY_COST_KEY,<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          DEFAULT_RACK_LOCALITY_COST<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      );<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    }<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span><a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    @Override<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    int regionIndexToEntityIndex(int region) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>      return cluster.getRackForRegion(region);<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><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>  /**<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>   * Base class the allows writing costs functions from rolling average of some<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>   * number from RegionLoad.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>   */<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>  abstract static class CostFromRegionLoadFunction extends CostFunction {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span><a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    private ClusterMetrics clusterStatus = null;<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    private Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; loads = null;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    private double[] stats = null;<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>    CostFromRegionLoadFunction(Configuration conf) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>      super(conf);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span><a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    void setClusterMetrics(ClusterMetrics status) {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      this.clusterStatus = status;<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>    }<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span><a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>    void setLoads(Map&lt;String, Deque&lt;BalancerRegionLoad&gt;&gt; l) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>      this.loads = l;<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    }<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span><a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    @Override<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    double cost() {<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      if (clusterStatus == null || loads == null) {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        return 0;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span><a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      if (stats == null || stats.length != cluster.numServers) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>        stats = new double[cluster.numServers];<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span><a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      for (int i =0; i &lt; stats.length; i++) {<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>        //Cost this server has from RegionLoad<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>        long cost = 0;<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>        // for every region on this server get the rl<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        for(int regionIndex:cluster.regionsPerServer[i]) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>          Collection&lt;BalancerRegionLoad&gt; regionLoadList =  cluster.regionLoads[regionIndex];<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span><a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>          // Now if we found a region load get the type of cost that was requested.<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>          if (regionLoadList != null) {<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>            cost = (long) (cost + getRegionLoadCost(regionLoadList));<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>          }<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>        }<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span><a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>        // Add the total cost to the stats.<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        stats[i] = cost;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      // Now return the scaled cost from data held in the stats object.<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      return costFromArray(stats);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      double cost = 0;<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        cost += getCostFromRl(rl);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      return cost / regionLoadList.size();<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    }<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span><a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    protected abstract double getCostFromRl(BalancerRegionLoad rl);<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>  /**<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>   * Class to be used for the subset of RegionLoad costs that should be treated as rates.<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>   * We do not compare about the actual rate in requests per second but rather the rate relative<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>   * to the rest of the regions.<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>   */<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>  abstract static class CostFromRegionLoadAsRateFunction extends CostFromRegionLoadFunction {<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span><a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    CostFromRegionLoadAsRateFunction(Configuration conf) {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>      super(conf);<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    }<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span><a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    @Override<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    protected double getRegionLoadCost(Collection&lt;BalancerRegionLoad&gt; regionLoadList) {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      double cost = 0;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      double previous = 0;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      boolean isFirst = true;<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      for (BalancerRegionLoad rl : regionLoadList) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        double current = getCostFromRl(rl);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        if (isFirst) {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          isFirst = false;<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>        } else {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>          cost += current - previous;<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        }<a name="line.1451"></a>
-<s

<TRUNCATED>

[32/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html
index 5f41fe7..c8158b5 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/RegionStates.ServerStateNode.html
@@ -524,636 +524,639 @@
 <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><a name="line.518"></a>
-<span class="sourceLineNo">519</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      if (!node.getTable().equals(tableName)) break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      regions.add(node);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    return regions;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      if (!node.getTable().equals(tableName)) break;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      regions.add(node.toRegionState());<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return regions;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      if (!node.getTable().equals(tableName)) break;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      regions.add(node.getRegionInfo());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    return regions;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    return regionsMap.values();<a name="line.547"></a>
+<span class="sourceLineNo">519</span>  public void deleteRegions(final List&lt;RegionInfo&gt; regionInfos) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    regionInfos.forEach(this::deleteRegion);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  ArrayList&lt;RegionStateNode&gt; getTableRegionStateNodes(final TableName tableName) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    final ArrayList&lt;RegionStateNode&gt; regions = new ArrayList&lt;RegionStateNode&gt;();<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (!node.getTable().equals(tableName)) break;<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      regions.add(node);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return regions;<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>  ArrayList&lt;RegionState&gt; getTableRegionStates(final TableName tableName) {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (!node.getTable().equals(tableName)) break;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      regions.add(node.toRegionState());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return regions;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  ArrayList&lt;RegionInfo&gt; getTableRegionsInfo(final TableName tableName) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    final ArrayList&lt;RegionInfo&gt; regions = new ArrayList&lt;RegionInfo&gt;();<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    for (RegionStateNode node: regionsMap.tailMap(tableName.getName()).values()) {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      if (!node.getTable().equals(tableName)) break;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      regions.add(node.getRegionInfo());<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    return regions;<a name="line.547"></a>
 <span class="sourceLineNo">548</span>  }<a name="line.548"></a>
 <span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      regions.add(node.toRegionState());<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    return regions;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  RegionState helpers<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  // ==========================================================================<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        return node.toRegionState();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      }<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    return null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
-<span class="sourceLineNo">575</span><a name="line.575"></a>
-<span class="sourceLineNo">576</span>  // ============================================================================================<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  //  TODO: helpers<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  // ============================================================================================<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    // TODO<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  }<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>  /**<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return getRegionsOfTable(table, false);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    synchronized (node) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      if (!include(node, false)) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        return null;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      if (node.isInState(State.OPEN)) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          node.getOpenSeqNum());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      } else if (node.isInState(State.OPENING)) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      } else {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        return null;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Get the regions to be reopened when modifying a table.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * &lt;p/&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<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>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p/&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * &lt;p/&gt;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * &lt;ul&gt;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * &lt;/ul&gt;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @param oldLoc the previous state/location of this region<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   *         means we still need to reopen the region.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    synchronized (node) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        // in OPEN state before<a name="line.644"></a>
-<span class="sourceLineNo">645</span>        if (node.isInState(State.OPEN)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>            // normal case, the region has been reopened<a name="line.647"></a>
-<span class="sourceLineNo">648</span>            return null;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          } else {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>            // the open seq num does not change, need to reopen again<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              node.getOpenSeqNum());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        } else {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.655"></a>
-<span class="sourceLineNo">656</span>          // finished maybe, but not a problem).<a name="line.656"></a>
-<span class="sourceLineNo">657</span>          return null;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      } else {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        // in OPENING state before<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          // reopened(not finished maybe, but not a problem)<a name="line.663"></a>
-<span class="sourceLineNo">664</span>          return null;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        } else {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>            return null;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>          }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          // is changed to OPEN.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   */<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   *         {@link State#SPLIT} state.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   */<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      .collect(Collectors.toList());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * Utility. Whether to include region in list of regions. Default is to<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * weed out split and offline regions.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   */<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    if (LOG.isTraceEnabled()) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    }<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Returns the set of regions hosted by the specified server<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   * @param serverName the server we are interested in<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * @return set of RegionInfo hosted by the specified server<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    synchronized (serverInfo) {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return serverInfo.getRegionInfoList();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  }<a name="line.725"></a>
-<span class="sourceLineNo">726</span><a name="line.726"></a>
-<span class="sourceLineNo">727</span>  // ============================================================================================<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  // Split helpers<a name="line.728"></a>
-<span class="sourceLineNo">729</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  // the ServerStateNode by calling removeServer.<a name="line.730"></a>
+<span class="sourceLineNo">550</span>  Collection&lt;RegionStateNode&gt; getRegionStateNodes() {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    return regionsMap.values();<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public ArrayList&lt;RegionState&gt; getRegionStates() {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    final ArrayList&lt;RegionState&gt; regions = new ArrayList&lt;RegionState&gt;(regionsMap.size());<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      regions.add(node.toRegionState());<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return regions;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
+<span class="sourceLineNo">561</span><a name="line.561"></a>
+<span class="sourceLineNo">562</span>  // ==========================================================================<a name="line.562"></a>
+<span class="sourceLineNo">563</span>  //  RegionState helpers<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  // ==========================================================================<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  public RegionState getRegionState(final RegionInfo regionInfo) {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    RegionStateNode regionStateNode = getRegionStateNode(regionInfo);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    return regionStateNode == null ? null : regionStateNode.toRegionState();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  public RegionState getRegionState(final String encodedRegionName) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // TODO: Need a map &lt;encodedName, ...&gt; but it is just dispatch merge...<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        return node.toRegionState();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    return null;<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>  //  TODO: helpers<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  // ============================================================================================<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public boolean hasTableRegionStates(final TableName tableName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // TODO<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    return !getTableRegionStates(tableName).isEmpty();<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
+<span class="sourceLineNo">587</span><a name="line.587"></a>
+<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(final TableName table) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return getRegionsOfTable(table, false);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  private HRegionLocation createRegionForReopen(RegionStateNode node) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    synchronized (node) {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      if (!include(node, false)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        return null;<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      if (node.isInState(State.OPEN)) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>          node.getOpenSeqNum());<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      } else if (node.isInState(State.OPENING)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), -1);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        return null;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Get the regions to be reopened when modifying a table.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * &lt;p/&gt;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * Notice that the {@code openSeqNum} in the returned HRegionLocation is also used to indicate the<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * state of this region, positive means the region is in {@link State#OPEN}, -1 means<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * {@link State#OPENING}. And for regions in other states we do not need reopen them.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public List&lt;HRegionLocation&gt; getRegionsOfTableForReopen(TableName tableName) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    return getTableRegionStateNodes(tableName).stream().map(this::createRegionForReopen)<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      .filter(r -&gt; r != null).collect(Collectors.toList());<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Check whether the region has been reopened. The meaning of the {@link HRegionLocation} is the<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * same with {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * &lt;p/&gt;<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   * For a region which is in {@link State#OPEN} before, if the region state is changed or the open<a name="line.627"></a>
+<span class="sourceLineNo">628</span>   * seq num is changed, we can confirm that it has been reopened.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * &lt;p/&gt;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * For a region which is in {@link State#OPENING} before, usually it will be in {@link State#OPEN}<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * now and we will schedule a MRP to reopen it. But there are several exceptions:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * &lt;ul&gt;<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * &lt;li&gt;The region is in state other than {@link State#OPEN} or {@link State#OPENING}.&lt;/li&gt;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * &lt;li&gt;The location of the region has been changed&lt;/li&gt;<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * &lt;/ul&gt;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * Of course the region could still be in {@link State#OPENING} state and still on the same<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * server, then here we will still return a {@link HRegionLocation} for it, just like<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * {@link #getRegionsOfTableForReopen(TableName)}.<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * @param oldLoc the previous state/location of this region<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * @return null if the region has been reopened, otherwise a new {@link HRegionLocation} which<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   *         means we still need to reopen the region.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @see #getRegionsOfTableForReopen(TableName)<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public HRegionLocation checkReopened(HRegionLocation oldLoc) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    RegionStateNode node = getRegionStateNode(oldLoc.getRegion());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    synchronized (node) {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      if (oldLoc.getSeqNum() &gt;= 0) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>        // in OPEN state before<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        if (node.isInState(State.OPEN)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>          if (node.getOpenSeqNum() &gt; oldLoc.getSeqNum()) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>            // normal case, the region has been reopened<a name="line.651"></a>
+<span class="sourceLineNo">652</span>            return null;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>          } else {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            // the open seq num does not change, need to reopen again<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(),<a name="line.655"></a>
+<span class="sourceLineNo">656</span>              node.getOpenSeqNum());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>          }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>        } else {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>          // the state has been changed so we can make sure that the region has been reopened(not<a name="line.659"></a>
+<span class="sourceLineNo">660</span>          // finished maybe, but not a problem).<a name="line.660"></a>
+<span class="sourceLineNo">661</span>          return null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      } else {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        // in OPENING state before<a name="line.664"></a>
+<span class="sourceLineNo">665</span>        if (!node.isInState(State.OPEN, State.OPENING)) {<a name="line.665"></a>
+<span class="sourceLineNo">666</span>          // not in OPEN or OPENING state, then we can make sure that the region has been<a name="line.666"></a>
+<span class="sourceLineNo">667</span>          // reopened(not finished maybe, but not a problem)<a name="line.667"></a>
+<span class="sourceLineNo">668</span>          return null;<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        } else {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>          if (!node.getRegionLocation().equals(oldLoc.getServerName())) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>            // the region has been moved, so we can make sure that the region has been reopened.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>            return null;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>          }<a name="line.673"></a>
+<span class="sourceLineNo">674</span>          // normal case, we are still in OPENING state, or the reopen has been opened and the state<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          // is changed to OPEN.<a name="line.675"></a>
+<span class="sourceLineNo">676</span>          long openSeqNum = node.isInState(State.OPEN) ? node.getOpenSeqNum() : -1;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>          return new HRegionLocation(node.getRegionInfo(), node.getRegionLocation(), openSeqNum);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        }<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      }<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * @return Return online regions of table; does not include OFFLINE or SPLITTING regions.<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   */<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, boolean offline) {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return getRegionsOfTable(table, state -&gt; include(state, offline));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @return Return the regions of the table; does not include OFFLINE unless you set<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *         &lt;code&gt;offline&lt;/code&gt; to true. Does not include regions that are in the<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *         {@link State#SPLIT} state.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   */<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  private List&lt;RegionInfo&gt; getRegionsOfTable(TableName table, Predicate&lt;RegionStateNode&gt; filter) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    return getTableRegionStateNodes(table).stream().filter(filter).map(n -&gt; n.getRegionInfo())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      .collect(Collectors.toList());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<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>   * Utility. Whether to include region in list of regions. Default is to<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * weed out split and offline regions.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @return True if we should include the &lt;code&gt;node&lt;/code&gt; (do not include<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * if split or offline unless &lt;code&gt;offline&lt;/code&gt; is set to true.<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   */<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  boolean include(final RegionStateNode node, final boolean offline) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    if (LOG.isTraceEnabled()) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      LOG.trace("WORKING ON " + node + " " + node.getRegionInfo());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    if (node.isInState(State.SPLIT)) return false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    if (node.isInState(State.OFFLINE) &amp;&amp; !offline) return false;<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    final RegionInfo hri = node.getRegionInfo();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return (!hri.isOffline() &amp;&amp; !hri.isSplit()) ||<a name="line.713"></a>
+<span class="sourceLineNo">714</span>        ((hri.isOffline() || hri.isSplit()) &amp;&amp; offline);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>  }<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>   * Returns the set of regions hosted by the specified server<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param serverName the server we are interested in<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return set of RegionInfo hosted by the specified server<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public List&lt;RegionInfo&gt; getServerRegionInfoSet(final ServerName serverName) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final ServerStateNode serverInfo = getServerNode(serverName);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    if (serverInfo == null) return Collections.emptyList();<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>    synchronized (serverInfo) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      return serverInfo.getRegionInfoList();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
 <span class="sourceLineNo">731</span>  // ============================================================================================<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    synchronized (serverNode) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      serverNode.setState(state);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @see #metaLogSplit(ServerName)<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   */<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    setServerState(serverName, ServerState.SPLITTING_META);<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>  /**<a name="line.748"></a>
-<span class="sourceLineNo">749</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * @see #metaLogSplitting(ServerName)<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   */<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public void metaLogSplit(ServerName serverName) {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  /**<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   * Call this when we start log splitting for a crashed Server.<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @see #logSplit(ServerName)<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
-<span class="sourceLineNo">760</span>  public void logSplitting(final ServerName serverName) {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    setServerState(serverName, ServerState.SPLITTING);<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>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Called after we've split all logs on a crashed Server.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * @see #logSplitting(ServerName)<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  public void logSplit(final ServerName serverName) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>  @VisibleForTesting<a name="line.772"></a>
-<span class="sourceLineNo">773</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    synchronized (regionNode) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      regionNode.setState(state);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    }<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  // ============================================================================================<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  //  TODO:<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  // ============================================================================================<a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      if (!node.isInTransition()) {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        result.add(node.getRegionInfo());<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    return result;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    if (region != null) {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      synchronized (region) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        return region.isInState(state);<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>    return false;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return isRegionInState(regionInfo, State.OPEN);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    for (RegionInfo hri: regions) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      if (node == null) continue;<a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>      // TODO: State.OPEN<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      final ServerName serverName = node.getRegionLocation();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      if (serverName == null) continue;<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      if (serverRegions == null) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        result.put(serverName, serverRegions);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      serverRegions.add(node.getRegionInfo());<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    }<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    return result;<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>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    return assignments;<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>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    final State[] states = State.values();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.846"></a>
-<span class="sourceLineNo">847</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<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>    for (RegionStateNode node: regionsMap.values()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      if (node.getTable().equals(tableName)) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    return tableRegions;<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>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    if (region != null) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      synchronized (region) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        ServerName server = region.getRegionLocation();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        return server != null ? server : region.getLastHost();<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>    return null;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  /**<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Can't let out original since it can change and at least the load balancer<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * @return A clone of current assignments by table.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   */<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      final boolean forceByCluster) {<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.881"></a>
-<span class="sourceLineNo">882</span><a name="line.882"></a>
-<span class="sourceLineNo">883</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<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>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result =<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      new HashMap&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt;(1);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    result.put(HConstants.ENSEMBLE_TABLE_NAME, ensemble);<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return result;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    final Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; result = new HashMap&lt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>      Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; tableResult = result.get(node.getTable());<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      if (tableResult == null) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        tableResult = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        result.put(node.getTable(), tableResult);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      final ServerName serverName = node.getRegionLocation();<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      if (serverName == null) {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        LOG.info("Skipping, no server for " + node);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        continue;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      List&lt;RegionInfo&gt; serverResult = tableResult.get(serverName);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      if (serverResult == null) {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        serverResult = new ArrayList&lt;RegionInfo&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        tableResult.put(serverName, serverResult);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      serverResult.add(node.getRegionInfo());<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add online servers with no assignment for the table.<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; table: result.values()) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>        for (ServerName svr : serverMap.keySet()) {<a name="line.920"></a>
-<span class="sourceLineNo">921</span>          if (!table.containsKey(svr)) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>            table.put(svr, new ArrayList&lt;RegionInfo&gt;());<a name="line.922"></a>
-<span class="sourceLineNo">923</span>          }<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>    return result;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  // ==========================================================================<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  //  Region in transition helpers<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  // ==========================================================================<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  protected boolean addRegionInTransition(final RegionStateNode regionNode,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      final RegionTransitionProcedure procedure) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (procedure != null &amp;&amp; !regionNode.setProcedure(procedure)) return false;<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    regionInTransition.put(regionNode.getRegionInfo(), regionNode);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return true;<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>  protected void removeRegionInTransition(final RegionStateNode regionNode,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      final RegionTransitionProcedure procedure) {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    regionInTransition.remove(regionNode.getRegionInfo());<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    regionNode.unsetProcedure(procedure);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  }<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>  public boolean hasRegionsInTransition() {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    return !regionInTransition.isEmpty();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>  public boolean isRegionInTransition(final RegionInfo regionInfo) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    final RegionStateNode node = regionInTransition.get(regionInfo);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return node != null ? node.isInTransition() : false;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * @return If a procedure-in-transition for &lt;code&gt;hri&lt;/code&gt;, return it else null.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   */<a name="line.957"></a>
-<span class="sourceLineNo">958</span>  public RegionTransitionProcedure getRegionTransitionProcedure(final RegionInfo hri) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (node == null) return null;<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    return node.getProcedure();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  }<a name="line.962"></a>
-<span class="sourceLineNo">963</span><a name="line.963"></a>
-<span class="sourceLineNo">964</span>  public RegionState getRegionTransitionState(final RegionInfo hri) {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    RegionStateNode node = regionInTransition.get(hri);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    if (node == null) return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span><a name="line.967"></a>
-<span class="sourceLineNo">968</span>    synchronized (node) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      return node.isInTransition() ? node.toRegionState() : null;<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  public List&lt;RegionStateNode&gt; getRegionsInTransition() {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    return new ArrayList&lt;RegionStateNode&gt;(regionInTransition.values());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>  /**<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * Get the number of regions in transition.<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  public int getRegionsInTransitionCount() {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    return regionInTransition.size();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>  }<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>  public List&lt;RegionState&gt; getRegionsStateInTransition() {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    final List&lt;RegionState&gt; rit = new ArrayList&lt;RegionState&gt;(regionInTransition.size());<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      rit.add(node.toRegionState());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    return rit;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>  }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>  public SortedSet&lt;RegionState&gt; getRegionsInTransitionOrderedByTimestamp() {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    final SortedSet&lt;RegionState&gt; rit = new TreeSet&lt;RegionState&gt;(REGION_STATE_STAMP_COMPARATOR);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    for (RegionStateNode node: regionInTransition.values()) {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      rit.add(node.toRegionState());<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return rit;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  //  Region offline helpers<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>  // ==========================================================================<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  // TODO: Populated when we read meta but regions never make it out of here.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  public void addToOfflineRegions(final RegionStateNode regionNode) {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    LOG.info("Added to offline, CURRENTLY NEVER CLEARED!!! " + regionNode);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    regionOffline.put(regionNode.getRegionInfo(), regionNode);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>  }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>  // TODO: Unused.<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  public void removeFromOfflineRegions(final RegionInfo regionInfo) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    regionOffline.remove(regionInfo);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>  }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span><a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>  // ==========================================================================<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>  //  Region FAIL_OPEN helpers<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>  // ==========================================================================<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  public static final class RegionFailedOpen {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    private final RegionStateNode regionNode;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span><a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    private volatile Exception exception = null;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    private AtomicInteger retries = new AtomicInteger();<a name="line.1021"></a>
+<span class="sourceLineNo">732</span>  // Split helpers<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  // These methods will only be called in ServerCrashProcedure, and at the end of SCP we will remove<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  // the ServerStateNode by calling removeServer.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>  // ============================================================================================<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>  private void setServerState(ServerName serverName, ServerState state) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    ServerStateNode serverNode = getOrCreateServer(serverName);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    synchronized (serverNode) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      serverNode.setState(state);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Call this when we start meta log splitting a crashed Server.<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @see #metaLogSplit(ServerName)<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   */<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public void metaLogSplitting(ServerName serverName) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    setServerState(serverName, ServerState.SPLITTING_META);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  /**<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   * Called after we've split the meta logs on a crashed Server.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @see #metaLogSplitting(ServerName)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public void metaLogSplit(ServerName serverName) {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    setServerState(serverName, ServerState.SPLITTING_META_DONE);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  }<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  /**<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * Call this when we start log splitting for a crashed Server.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @see #logSplit(ServerName)<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public void logSplitting(final ServerName serverName) {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    setServerState(serverName, ServerState.SPLITTING);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  /**<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * Called after we've split all logs on a crashed Server.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   * @see #logSplitting(ServerName)<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  public void logSplit(final ServerName serverName) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    setServerState(serverName, ServerState.OFFLINE);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public void updateRegionState(final RegionInfo regionInfo, final State state) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    final RegionStateNode regionNode = getOrCreateRegionStateNode(regionInfo);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    synchronized (regionNode) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      regionNode.setState(state);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    }<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>  // ============================================================================================<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  //  TODO:<a name="line.784"></a>
+<span class="sourceLineNo">785</span>  // ============================================================================================<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  public List&lt;RegionInfo&gt; getAssignedRegions() {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    final List&lt;RegionInfo&gt; result = new ArrayList&lt;RegionInfo&gt;();<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      if (!node.isInTransition()) {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        result.add(node.getRegionInfo());<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    return result;<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  }<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public boolean isRegionInState(final RegionInfo regionInfo, final State... state) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    if (region != null) {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      synchronized (region) {<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        return region.isInState(state);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      }<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return false;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public boolean isRegionOnline(final RegionInfo regionInfo) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return isRegionInState(regionInfo, State.OPEN);<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>   * @return True if region is offline (In OFFLINE or CLOSED state).<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   */<a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public boolean isRegionOffline(final RegionInfo regionInfo) {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return isRegionInState(regionInfo, State.OFFLINE, State.CLOSED);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; getSnapShotOfAssignment(<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      final Collection&lt;RegionInfo&gt; regions) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; result = new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;();<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    for (RegionInfo hri: regions) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final RegionStateNode node = getRegionStateNode(hri);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (node == null) continue;<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>      // TODO: State.OPEN<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      final ServerName serverName = node.getRegionLocation();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      if (serverName == null) continue;<a name="line.826"></a>
+<span class="sourceLineNo">827</span><a name="line.827"></a>
+<span class="sourceLineNo">828</span>      List&lt;RegionInfo&gt; serverRegions = result.get(serverName);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      if (serverRegions == null) {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>        serverRegions = new ArrayList&lt;RegionInfo&gt;();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>        result.put(serverName, serverRegions);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      serverRegions.add(node.getRegionInfo());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    }<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    return result;<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span><a name="line.838"></a>
+<span class="sourceLineNo">839</span>  public Map&lt;RegionInfo, ServerName&gt; getRegionAssignments() {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    final HashMap&lt;RegionInfo, ServerName&gt; assignments = new HashMap&lt;RegionInfo, ServerName&gt;();<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      assignments.put(node.getRegionInfo(), node.getRegionLocation());<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    }<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    return assignments;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
+<span class="sourceLineNo">846</span><a name="line.846"></a>
+<span class="sourceLineNo">847</span>  public Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; getRegionByStateOfTable(TableName tableName) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    final State[] states = State.values();<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    final Map&lt;RegionState.State, List&lt;RegionInfo&gt;&gt; tableRegions =<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        new HashMap&lt;State, List&lt;RegionInfo&gt;&gt;(states.length);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    for (int i = 0; i &lt; states.length; ++i) {<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      tableRegions.put(states[i], new ArrayList&lt;RegionInfo&gt;());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    }<a name="line.853"></a>
+<span class="sourceLineNo">854</span><a name="line.854"></a>
+<span class="sourceLineNo">855</span>    for (RegionStateNode node: regionsMap.values()) {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      if (node.getTable().equals(tableName)) {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        tableRegions.get(node.getState()).add(node.getRegionInfo());<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>    return tableRegions;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>  public ServerName getRegionServerOfRegion(final RegionInfo regionInfo) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    final RegionStateNode region = getRegionStateNode(regionInfo);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    if (region != null) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      synchronized (region) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        ServerName server = region.getRegionLocation();<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        return server != null ? server : region.getLastHost();<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      }<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    return null;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
+<span class="sourceLineNo">875</span>   * This is an EXPENSIVE clone.  Cloning though is the safest thing to do.<a name="line.875"></a>
+<span class="sourceLineNo">876</span>   * Can't let out original since it can change and at least the load balancer<a name="line.876"></a>
+<span class="sourceLineNo">877</span>   * wants to iterate this exported list.  We need to synchronize on regions<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * since all access to this.servers is under a lock on this.regions.<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * @param forceByCluster a flag to force to aggregate the server-load to the cluster level<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * @return A clone of current assignments by table.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   */<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public Map&lt;TableName, Map&lt;ServerName, List&lt;RegionInfo&gt;&gt;&gt; getAssignmentsByTable(<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      final boolean forceByCluster) {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    if (!forceByCluster) return getAssignmentsByTable();<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>    final HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt; ensemble =<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      new HashMap&lt;ServerName, List&lt;RegionInfo&gt;&gt;(serverMap.size());<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    for (ServerStateNode serverNode: serverMap.values()) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      ensemble.put(serverNode.getServerName(), serverNode.getRegionInfoList());<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>    // TODO: can we use Collections.singletonMap(HConstants.ENSEMBLE_TABLE_NAME, ensemble)?<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    final Map&lt;TableName, Map&lt;ServerNam

<TRUNCATED>

[03/51] [partial] hbase-site git commit: Published site at b4759ce6e72f50ccd9d410bd5917dc5a515414f1.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/df8fd1d3/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
index 3d7093a..9917ee8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.RegionReplicaOutputSink.html
@@ -39,594 +39,612 @@
 <span class="sourceLineNo">031</span>import java.util.concurrent.ThreadPoolExecutor;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.TimeUnit;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.Path;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.TableName;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ClusterConnection;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionAdminServiceCallable;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RegionInfo;<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.RetryingCallable;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RpcRetryingCallerFactory;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.ipc.HBaseRpcController;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.replication.WALEntryFilter;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.wal.WALSplitter.EntryBuffers;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.wal.WALSplitter.OutputSink;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.wal.WALSplitter.PipelineController;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.wal.WALSplitter.RegionEntryBuffer;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.wal.WALSplitter.SinkWriter;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.util.StringUtils;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.slf4j.Logger;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.slf4j.LoggerFactory;<a name="line.72"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.conf.Configuration;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.Path;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HBaseIOException;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HConstants;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.TableDescriptors;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableName;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.ClusterConnection;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.RegionAdminServiceCallable;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RetryingCallable;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.RpcRetryingCallerFactory;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.ipc.HBaseRpcController;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.replication.WALEntryFilter;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.wal.WALSplitter.EntryBuffers;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.wal.WALSplitter.OutputSink;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.wal.WALSplitter.PipelineController;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.wal.WALSplitter.RegionEntryBuffer;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.wal.WALSplitter.SinkWriter;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.util.StringUtils;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.slf4j.Logger;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.slf4j.LoggerFactory;<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
 <span class="sourceLineNo">073</span>import org.apache.hbase.thirdparty.com.google.common.cache.Cache;<a name="line.73"></a>
 <span class="sourceLineNo">074</span>import org.apache.hbase.thirdparty.com.google.common.cache.CacheBuilder;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse;<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>/**<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * A {@link org.apache.hadoop.hbase.replication.ReplicationEndpoint} endpoint<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * which receives the WAL edits from the WAL, and sends the edits to replicas<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * of regions.<a name="line.81"></a>
-<span class="sourceLineNo">082</span> */<a name="line.82"></a>
-<span class="sourceLineNo">083</span>@InterfaceAudience.Private<a name="line.83"></a>
-<span class="sourceLineNo">084</span>public class RegionReplicaReplicationEndpoint extends HBaseReplicationEndpoint {<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private static final Logger LOG = LoggerFactory.getLogger(RegionReplicaReplicationEndpoint.class);<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  // Can be configured differently than hbase.client.retries.number<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private static String CLIENT_RETRIES_NUMBER<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    = "hbase.region.replica.replication.client.retries.number";<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private Configuration conf;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private ClusterConnection connection;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private TableDescriptors tableDescriptors;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>  // Reuse WALSplitter constructs as a WAL pipe<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private PipelineController controller;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private RegionReplicaOutputSink outputSink;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private EntryBuffers entryBuffers;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  // Number of writer threads<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private int numWriterThreads;<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private int operationTimeout;<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private ExecutorService pool;<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void init(Context context) throws IOException {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    super.init(context);<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    this.conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    this.tableDescriptors = context.getTableDescriptors();<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // HRS multiplies client retries by 10 globally for meta operations, but we do not want this.<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    // We are resetting it here because we want default number of retries (35) rather than 10 times<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // that which makes very long retries for disabled tables etc.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    int defaultNumRetries = conf.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    if (defaultNumRetries &gt; 10) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      int mult = conf.getInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        HConstants.DEFAULT_HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      defaultNumRetries = defaultNumRetries / mult; // reset if HRS has multiplied this already<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    }<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>    conf.setInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER, 1);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    int numRetries = conf.getInt(CLIENT_RETRIES_NUMBER, defaultNumRetries);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, numRetries);<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this.numWriterThreads = this.conf.getInt(<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      "hbase.region.replica.replication.writer.threads", 3);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    controller = new PipelineController();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    entryBuffers = new EntryBuffers(controller,<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.conf.getInt("hbase.region.replica.replication.buffersize",<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          128*1024*1024));<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // use the regular RPC timeout for replica replication RPC's<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    this.operationTimeout = conf.getInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT,<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  @Override<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  protected void doStart() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    try {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      connection = (ClusterConnection) ConnectionFactory.createConnection(this.conf);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      this.pool = getDefaultThreadPool(conf);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      outputSink = new RegionReplicaOutputSink(controller, tableDescriptors, entryBuffers,<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        connection, pool, numWriterThreads, operationTimeout);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      outputSink.startWriterThreads();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      super.doStart();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    } catch (IOException ex) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      LOG.warn("Received exception while creating connection :" + ex);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      notifyFailed(ex);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  protected void doStop() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    if (outputSink != null) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      try {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        outputSink.finishWritingAndClose();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      } catch (IOException ex) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        LOG.warn("Got exception while trying to close OutputSink", ex);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    if (this.pool != null) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      this.pool.shutdownNow();<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      try {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        // wait for 10 sec<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        boolean shutdown = this.pool.awaitTermination(10000, TimeUnit.MILLISECONDS);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        if (!shutdown) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          LOG.warn("Failed to shutdown the thread pool after 10 seconds");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      } catch (InterruptedException e) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        LOG.warn("Got interrupted while waiting for the thread pool to shut down" + e);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      }<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    if (connection != null) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      try {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        connection.close();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      } catch (IOException ex) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        LOG.warn("Got exception closing connection :" + ex);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    super.doStop();<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>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Returns a Thread pool for the RPC's to region replicas. Similar to<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * Connection's thread pool.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   */<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private ExecutorService getDefaultThreadPool(Configuration conf) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    int maxThreads = conf.getInt("hbase.region.replica.replication.threads.max", 256);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (maxThreads == 0) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      maxThreads = Runtime.getRuntime().availableProcessors() * 8;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    long keepAliveTime = conf.getLong("hbase.region.replica.replication.threads.keepalivetime", 60);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    LinkedBlockingQueue&lt;Runnable&gt; workQueue =<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        new LinkedBlockingQueue&lt;&gt;(maxThreads *<a name="line.199"></a>
-<span class="sourceLineNo">200</span>            conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,<a name="line.200"></a>
-<span class="sourceLineNo">201</span>              HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS));<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ThreadPoolExecutor tpe = new ThreadPoolExecutor(<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      maxThreads,<a name="line.203"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ReplicateWALEntryResponse;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>/**<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * A {@link org.apache.hadoop.hbase.replication.ReplicationEndpoint} endpoint<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * which receives the WAL edits from the WAL, and sends the edits to replicas<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * of regions.<a name="line.82"></a>
+<span class="sourceLineNo">083</span> */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>@InterfaceAudience.Private<a name="line.84"></a>
+<span class="sourceLineNo">085</span>public class RegionReplicaReplicationEndpoint extends HBaseReplicationEndpoint {<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final Logger LOG = LoggerFactory.getLogger(RegionReplicaReplicationEndpoint.class);<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  // Can be configured differently than hbase.client.retries.number<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private static String CLIENT_RETRIES_NUMBER<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    = "hbase.region.replica.replication.client.retries.number";<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private Configuration conf;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private ClusterConnection connection;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private TableDescriptors tableDescriptors;<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  // Reuse WALSplitter constructs as a WAL pipe<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private PipelineController controller;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  private RegionReplicaOutputSink outputSink;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private EntryBuffers entryBuffers;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  // Number of writer threads<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private int numWriterThreads;<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private int operationTimeout;<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private ExecutorService pool;<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Override<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void init(Context context) throws IOException {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    super.init(context);<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    this.conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    this.tableDescriptors = context.getTableDescriptors();<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // HRS multiplies client retries by 10 globally for meta operations, but we do not want this.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // We are resetting it here because we want default number of retries (35) rather than 10 times<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // that which makes very long retries for disabled tables etc.<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    int defaultNumRetries = conf.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    if (defaultNumRetries &gt; 10) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      int mult = conf.getInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        HConstants.DEFAULT_HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      defaultNumRetries = defaultNumRetries / mult; // reset if HRS has multiplied this already<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>    conf.setInt(HConstants.HBASE_CLIENT_SERVERSIDE_RETRIES_MULTIPLIER, 1);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    int numRetries = conf.getInt(CLIENT_RETRIES_NUMBER, defaultNumRetries);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, numRetries);<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    this.numWriterThreads = this.conf.getInt(<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      "hbase.region.replica.replication.writer.threads", 3);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    controller = new PipelineController();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    entryBuffers = new EntryBuffers(controller,<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.conf.getInt("hbase.region.replica.replication.buffersize",<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          128*1024*1024));<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>    // use the regular RPC timeout for replica replication RPC's<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.operationTimeout = conf.getInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  protected void doStart() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      connection = (ClusterConnection) ConnectionFactory.createConnection(this.conf);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      this.pool = getDefaultThreadPool(conf);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      outputSink = new RegionReplicaOutputSink(controller, tableDescriptors, entryBuffers,<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        connection, pool, numWriterThreads, operationTimeout);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      outputSink.startWriterThreads();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      super.doStart();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    } catch (IOException ex) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      LOG.warn("Received exception while creating connection :" + ex);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      notifyFailed(ex);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  @Override<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  protected void doStop() {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    if (outputSink != null) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      try {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        outputSink.finishWritingAndClose();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      } catch (IOException ex) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        LOG.warn("Got exception while trying to close OutputSink", ex);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    if (this.pool != null) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      this.pool.shutdownNow();<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      try {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        // wait for 10 sec<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        boolean shutdown = this.pool.awaitTermination(10000, TimeUnit.MILLISECONDS);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        if (!shutdown) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          LOG.warn("Failed to shutdown the thread pool after 10 seconds");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      } catch (InterruptedException e) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        LOG.warn("Got interrupted while waiting for the thread pool to shut down" + e);<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>    if (connection != null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      try {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        connection.close();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      } catch (IOException ex) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        LOG.warn("Got exception closing connection :" + ex);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    super.doStop();<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Returns a Thread pool for the RPC's to region replicas. Similar to<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Connection's thread pool.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private ExecutorService getDefaultThreadPool(Configuration conf) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    int maxThreads = conf.getInt("hbase.region.replica.replication.threads.max", 256);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    if (maxThreads == 0) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      maxThreads = Runtime.getRuntime().availableProcessors() * 8;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    long keepAliveTime = conf.getLong("hbase.region.replica.replication.threads.keepalivetime", 60);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    LinkedBlockingQueue&lt;Runnable&gt; workQueue =<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        new LinkedBlockingQueue&lt;&gt;(maxThreads *<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,<a name="line.201"></a>
+<span class="sourceLineNo">202</span>              HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS));<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ThreadPoolExecutor tpe = new ThreadPoolExecutor(<a name="line.203"></a>
 <span class="sourceLineNo">204</span>      maxThreads,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      keepAliveTime,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      TimeUnit.SECONDS,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      workQueue,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      Threads.newDaemonThreadFactory(this.getClass().getSimpleName() + "-rpc-shared-"));<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    tpe.allowCoreThreadTimeOut(true);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return tpe;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  @Override<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  public boolean replicate(ReplicateContext replicateContext) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    /* A note on batching in RegionReplicaReplicationEndpoint (RRRE):<a name="line.215"></a>
-<span class="sourceLineNo">216</span>     *<a name="line.216"></a>
-<span class="sourceLineNo">217</span>     * RRRE relies on batching from two different mechanisms. The first is the batching from<a name="line.217"></a>
-<span class="sourceLineNo">218</span>     * ReplicationSource since RRRE is a ReplicationEndpoint driven by RS. RS reads from a single<a name="line.218"></a>
-<span class="sourceLineNo">219</span>     * WAL file filling up a buffer of heap size "replication.source.size.capacity"(64MB) or at most<a name="line.219"></a>
-<span class="sourceLineNo">220</span>     * "replication.source.nb.capacity" entries or until it sees the end of file (in live tailing).<a name="line.220"></a>
-<span class="sourceLineNo">221</span>     * Then RS passes all the buffered edits in this replicate() call context. RRRE puts the edits<a name="line.221"></a>
-<span class="sourceLineNo">222</span>     * to the WALSplitter.EntryBuffers which is a blocking buffer space of up to<a name="line.222"></a>
-<span class="sourceLineNo">223</span>     * "hbase.region.replica.replication.buffersize" (128MB) in size. This buffer splits the edits<a name="line.223"></a>
-<span class="sourceLineNo">224</span>     * based on regions.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>     *<a name="line.225"></a>
-<span class="sourceLineNo">226</span>     * There are "hbase.region.replica.replication.writer.threads"(default 3) writer threads which<a name="line.226"></a>
-<span class="sourceLineNo">227</span>     * pick largest per-region buffer and send it to the SinkWriter (see RegionReplicaOutputSink).<a name="line.227"></a>
-<span class="sourceLineNo">228</span>     * The SinkWriter in this case will send the wal edits to all secondary region replicas in<a name="line.228"></a>
-<span class="sourceLineNo">229</span>     * parallel via a retrying rpc call. EntryBuffers guarantees that while a buffer is<a name="line.229"></a>
-<span class="sourceLineNo">230</span>     * being written to the sink, another buffer for the same region will not be made available to<a name="line.230"></a>
-<span class="sourceLineNo">231</span>     * writers ensuring regions edits are not replayed out of order.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>     *<a name="line.232"></a>
-<span class="sourceLineNo">233</span>     * The replicate() call won't return until all the buffers are sent and ack'd by the sinks so<a name="line.233"></a>
-<span class="sourceLineNo">234</span>     * that the replication can assume all edits are persisted. We may be able to do a better<a name="line.234"></a>
-<span class="sourceLineNo">235</span>     * pipelining between the replication thread and output sinks later if it becomes a bottleneck.<a name="line.235"></a>
-<span class="sourceLineNo">236</span>     */<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    while (this.isRunning()) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        for (Entry entry: replicateContext.getEntries()) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          entryBuffers.appendEntry(entry);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        }<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        outputSink.flush(); // make sure everything is flushed<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        ctx.getMetrics().incrLogEditsFiltered(<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          outputSink.getSkippedEditsCounter().getAndSet(0));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        return true;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      } catch (InterruptedException e) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        Thread.currentThread().interrupt();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        return false;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      } catch (IOException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        LOG.warn("Received IOException while trying to replicate"<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            + StringUtils.stringifyException(e));<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return false;<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>  @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  public boolean canReplicateToSameCluster() {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    return true;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  protected WALEntryFilter getScopeWALEntryFilter() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    // we do not care about scope. We replicate everything.<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return null;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  static class RegionReplicaOutputSink extends OutputSink {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    private final RegionReplicaSinkWriter sinkWriter;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private final TableDescriptors tableDescriptors;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final Cache&lt;TableName, Boolean&gt; memstoreReplicationEnabled;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    public RegionReplicaOutputSink(PipelineController controller, TableDescriptors tableDescriptors,<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        EntryBuffers entryBuffers, ClusterConnection connection, ExecutorService pool,<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        int numWriters, int operationTimeout) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      super(controller, entryBuffers, numWriters);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      this.sinkWriter = new RegionReplicaSinkWriter(this, connection, pool, operationTimeout);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.tableDescriptors = tableDescriptors;<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>      // A cache for the table "memstore replication enabled" flag.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      // It has a default expiry of 5 sec. This means that if the table is altered<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      // with a different flag value, we might miss to replicate for that amount of<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      // time. But this cache avoid the slow lookup and parsing of the TableDescriptor.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      int memstoreReplicationEnabledCacheExpiryMs = connection.getConfiguration()<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        .getInt("hbase.region.replica.replication.cache.memstoreReplicationEnabled.expiryMs", 5000);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      this.memstoreReplicationEnabled = CacheBuilder.newBuilder()<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        .expireAfterWrite(memstoreReplicationEnabledCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.289"></a>
-<span class="sourceLineNo">290</span>        .initialCapacity(10)<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        .maximumSize(1000)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        .build();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    @Override<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    public void append(RegionEntryBuffer buffer) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      List&lt;Entry&gt; entries = buffer.getEntryBuffer();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>      if (entries.isEmpty() || entries.get(0).getEdit().getCells().isEmpty()) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        return;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>      // meta edits (e.g. flush) are always replicated.<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      // data edits (e.g. put) are replicated if the table requires them.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      if (!requiresReplication(buffer.getTableName(), entries)) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        return;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      sinkWriter.append(buffer.getTableName(), buffer.getEncodedRegionName(),<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        CellUtil.cloneRow(entries.get(0).getEdit().getCells().get(0)), entries);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    @Override<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    public boolean flush() throws IOException {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      // nothing much to do for now. Wait for the Writer threads to finish up<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // append()'ing the data.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      entryBuffers.waitUntilDrained();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      return super.flush();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    @Override<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    public boolean keepRegionEvent(Entry entry) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    public List&lt;Path&gt; finishWritingAndClose() throws IOException {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      finishWriting(true);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      return null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>    @Override<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    public Map&lt;byte[], Long&gt; getOutputCounts() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      return null; // only used in tests<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>    @Override<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    public int getNumberOfRecoveredRegions() {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      return 0;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>    AtomicLong getSkippedEditsCounter() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      return skippedEdits;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>    /**<a name="line.346"></a>
-<span class="sourceLineNo">347</span>     * returns true if the specified entry must be replicated.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>     * We should always replicate meta operations (e.g. flush)<a name="line.348"></a>
-<span class="sourceLineNo">349</span>     * and use the user HTD flag to decide whether or not replicate the memstore.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>     */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    private boolean requiresReplication(final TableName tableName, final List&lt;Entry&gt; entries)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        throws IOException {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      // unit-tests may not the TableDescriptors, bypass the check and always replicate<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      if (tableDescriptors == null) return true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>      Boolean requiresReplication = memstoreReplicationEnabled.getIfPresent(tableName);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      if (requiresReplication == null) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        // check if the table requires memstore replication<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        // some unit-test drop the table, so we should do a bypass check and always replicate.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        TableDescriptor htd = tableDescriptors.get(tableName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        requiresReplication = htd == null || htd.hasRegionMemStoreReplication();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        memstoreReplicationEnabled.put(tableName, requiresReplication);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>      // if memstore replication is not required, check the entries.<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      // meta edits (e.g. flush) must be always replicated.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      if (!requiresReplication) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        int skipEdits = 0;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        java.util.Iterator&lt;Entry&gt; it = entries.iterator();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        while (it.hasNext()) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          Entry entry = it.next();<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          if (entry.getEdit().isMetaEdit()) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>            requiresReplication = true;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>            it.remove();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            skipEdits++;<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>        skippedEdits.addAndGet(skipEdits);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      return requiresReplication;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    }<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  }<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>  static class RegionReplicaSinkWriter extends SinkWriter {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    RegionReplicaOutputSink sink;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    ClusterConnection connection;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    RpcControllerFactory rpcControllerFactory;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    RpcRetryingCallerFactory rpcRetryingCallerFactory;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    int operationTimeout;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    ExecutorService pool;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Cache&lt;TableName, Boolean&gt; disabledAndDroppedTables;<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>    public RegionReplicaSinkWriter(RegionReplicaOutputSink sink, ClusterConnection connection,<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        ExecutorService pool, int operationTimeout) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      this.sink = sink;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      this.connection = connection;<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      this.operationTimeout = operationTimeout;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      this.rpcRetryingCallerFactory<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        = RpcRetryingCallerFactory.instantiate(connection.getConfiguration());<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      this.rpcControllerFactory = RpcControllerFactory.instantiate(connection.getConfiguration());<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      this.pool = pool;<a name="line.402"></a>
-<span class="sourceLineNo">403</span><a name="line.403"></a>
-<span class="sourceLineNo">404</span>      int nonExistentTableCacheExpiryMs = connection.getConfiguration()<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        .getInt("hbase.region.replica.replication.cache.disabledAndDroppedTables.expiryMs", 5000);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      // A cache for non existing tables that have a default expiry of 5 sec. This means that if the<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      // table is created again with the same name, we might miss to replicate for that amount of<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      // time. But this cache prevents overloading meta requests for every edit from a deleted file.<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      disabledAndDroppedTables = CacheBuilder.newBuilder()<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        .expireAfterWrite(nonExistentTableCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        .initialCapacity(10)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        .maximumSize(1000)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        .build();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>    public void append(TableName tableName, byte[] encodedRegionName, byte[] row,<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        List&lt;Entry&gt; entries) throws IOException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      if (disabledAndDroppedTables.getIfPresent(tableName) != null) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        if (LOG.isTraceEnabled()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            + " is cached as a disabled or dropped table");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          for (Entry entry : entries) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            LOG.trace("Skipping : " + entry);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          }<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>      // If the table is disabled or dropped, we should not replay the entries, and we can skip<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      // replaying them. However, we might not know whether the table is disabled until we<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      // invalidate the cache and check from meta<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      RegionLocations locations = null;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      boolean useCache = true;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      while (true) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        // get the replicas of the primary region<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          locations = RegionReplicaReplayCallable<a name="line.439"></a>
-<span class="sourceLineNo">440</span>              .getRegionLocations(connection, tableName, row, useCache, 0);<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>          if (locations == null) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>            throw new HBaseIOException("Cannot locate locations for "<a name="line.443"></a>
-<span class="sourceLineNo">444</span>                + tableName + ", row:" + Bytes.toStringBinary(row));<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          }<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        } catch (TableNotFoundException e) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          if (LOG.isTraceEnabled()) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.448"></a>
-<span class="sourceLineNo">449</span>              + " is dropped. Adding table to cache.");<a name="line.449"></a>
-<span class="sourceLineNo">450</span>            for (Entry entry : entries) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              LOG.trace("Skipping : " + entry);<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>          disabledAndDroppedTables.put(tableName, Boolean.TRUE); // put to cache. Value ignored<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          // skip this entry<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.456"></a>
-<span class="sourceLineNo">457</span>          return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>        // check whether we should still replay this entry. If the regions are changed, or the<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        // entry is not coming from the primary region, filter it out.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        HRegionLocation primaryLocation = locations.getDefaultRegionLocation();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        if (!Bytes.equals(primaryLocation.getRegionInfo().getEncodedNameAsBytes(),<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          encodedRegionName)) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          if (useCache) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>            useCache = false;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>            continue; // this will retry location lookup<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          if (LOG.isTraceEnabled()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>            LOG.trace("Skipping " + entries.size() + " entries in table " + tableName<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              + " because located region " + primaryLocation.getRegionInfo().getEncodedName()<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              + " is different than the original region " + Bytes.toStringBinary(encodedRegionName)<a name="line.472"></a>
-<span class="sourceLineNo">473</span>              + " from WALEdit");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            for (Entry entry : entries) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>              LOG.trace("Skipping : " + entry);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>            }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          return;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        break;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>      if (locations.size() == 1) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>        return;<a name="line.485"></a>
+<span class="sourceLineNo">205</span>      maxThreads,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      keepAliveTime,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      TimeUnit.SECONDS,<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      workQueue,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      Threads.newDaemonThreadFactory(this.getClass().getSimpleName() + "-rpc-shared-"));<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    tpe.allowCoreThreadTimeOut(true);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return tpe;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  public boolean replicate(ReplicateContext replicateContext) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    /* A note on batching in RegionReplicaReplicationEndpoint (RRRE):<a name="line.216"></a>
+<span class="sourceLineNo">217</span>     *<a name="line.217"></a>
+<span class="sourceLineNo">218</span>     * RRRE relies on batching from two different mechanisms. The first is the batching from<a name="line.218"></a>
+<span class="sourceLineNo">219</span>     * ReplicationSource since RRRE is a ReplicationEndpoint driven by RS. RS reads from a single<a name="line.219"></a>
+<span class="sourceLineNo">220</span>     * WAL file filling up a buffer of heap size "replication.source.size.capacity"(64MB) or at most<a name="line.220"></a>
+<span class="sourceLineNo">221</span>     * "replication.source.nb.capacity" entries or until it sees the end of file (in live tailing).<a name="line.221"></a>
+<span class="sourceLineNo">222</span>     * Then RS passes all the buffered edits in this replicate() call context. RRRE puts the edits<a name="line.222"></a>
+<span class="sourceLineNo">223</span>     * to the WALSplitter.EntryBuffers which is a blocking buffer space of up to<a name="line.223"></a>
+<span class="sourceLineNo">224</span>     * "hbase.region.replica.replication.buffersize" (128MB) in size. This buffer splits the edits<a name="line.224"></a>
+<span class="sourceLineNo">225</span>     * based on regions.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>     *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>     * There are "hbase.region.replica.replication.writer.threads"(default 3) writer threads which<a name="line.227"></a>
+<span class="sourceLineNo">228</span>     * pick largest per-region buffer and send it to the SinkWriter (see RegionReplicaOutputSink).<a name="line.228"></a>
+<span class="sourceLineNo">229</span>     * The SinkWriter in this case will send the wal edits to all secondary region replicas in<a name="line.229"></a>
+<span class="sourceLineNo">230</span>     * parallel via a retrying rpc call. EntryBuffers guarantees that while a buffer is<a name="line.230"></a>
+<span class="sourceLineNo">231</span>     * being written to the sink, another buffer for the same region will not be made available to<a name="line.231"></a>
+<span class="sourceLineNo">232</span>     * writers ensuring regions edits are not replayed out of order.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>     *<a name="line.233"></a>
+<span class="sourceLineNo">234</span>     * The replicate() call won't return until all the buffers are sent and ack'd by the sinks so<a name="line.234"></a>
+<span class="sourceLineNo">235</span>     * that the replication can assume all edits are persisted. We may be able to do a better<a name="line.235"></a>
+<span class="sourceLineNo">236</span>     * pipelining between the replication thread and output sinks later if it becomes a bottleneck.<a name="line.236"></a>
+<span class="sourceLineNo">237</span>     */<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    while (this.isRunning()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        for (Entry entry: replicateContext.getEntries()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          entryBuffers.appendEntry(entry);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        outputSink.flush(); // make sure everything is flushed<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        ctx.getMetrics().incrLogEditsFiltered(<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          outputSink.getSkippedEditsCounter().getAndSet(0));<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        return true;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      } catch (InterruptedException e) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        Thread.currentThread().interrupt();<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        return false;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      } catch (IOException e) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        LOG.warn("Received IOException while trying to replicate"<a name="line.252"></a>
+<span class="sourceLineNo">253</span>            + StringUtils.stringifyException(e));<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    return false;<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>  @Override<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public boolean canReplicateToSameCluster() {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    return true;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  protected WALEntryFilter getScopeWALEntryFilter() {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // we do not care about scope. We replicate everything.<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    return null;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  static class RegionReplicaOutputSink extends OutputSink {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    private final RegionReplicaSinkWriter sinkWriter;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private final TableDescriptors tableDescriptors;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private final Cache&lt;TableName, Boolean&gt; memstoreReplicationEnabled;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    public RegionReplicaOutputSink(PipelineController controller, TableDescriptors tableDescriptors,<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        EntryBuffers entryBuffers, ClusterConnection connection, ExecutorService pool,<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        int numWriters, int operationTimeout) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      super(controller, entryBuffers, numWriters);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      this.sinkWriter =<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          new RegionReplicaSinkWriter(this, connection, pool, operationTimeout, tableDescriptors);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      this.tableDescriptors = tableDescriptors;<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>      // A cache for the table "memstore replication enabled" flag.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      // It has a default expiry of 5 sec. This means that if the table is altered<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // with a different flag value, we might miss to replicate for that amount of<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // time. But this cache avoid the slow lookup and parsing of the TableDescriptor.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      int memstoreReplicationEnabledCacheExpiryMs = connection.getConfiguration()<a name="line.288"></a>
+<span class="sourceLineNo">289</span>        .getInt("hbase.region.replica.replication.cache.memstoreReplicationEnabled.expiryMs", 5000);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      this.memstoreReplicationEnabled = CacheBuilder.newBuilder()<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        .expireAfterWrite(memstoreReplicationEnabledCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        .initialCapacity(10)<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        .maximumSize(1000)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        .build();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
+<span class="sourceLineNo">296</span><a name="line.296"></a>
+<span class="sourceLineNo">297</span>    @Override<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    public void append(RegionEntryBuffer buffer) throws IOException {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      List&lt;Entry&gt; entries = buffer.getEntryBuffer();<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>      if (entries.isEmpty() || entries.get(0).getEdit().getCells().isEmpty()) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        return;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>      // meta edits (e.g. flush) are always replicated.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      // data edits (e.g. put) are replicated if the table requires them.<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      if (!requiresReplication(buffer.getTableName(), entries)) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        return;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>      sinkWriter.append(buffer.getTableName(), buffer.getEncodedRegionName(),<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        CellUtil.cloneRow(entries.get(0).getEdit().getCells().get(0)), entries);<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>    @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    public boolean flush() throws IOException {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // nothing much to do for now. Wait for the Writer threads to finish up<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // append()'ing the data.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      entryBuffers.waitUntilDrained();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      return super.flush();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>    @Override<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    public boolean keepRegionEvent(Entry entry) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      return true;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>    @Override<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    public List&lt;Path&gt; finishWritingAndClose() throws IOException {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      finishWriting(true);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      return null;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>    @Override<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    public Map&lt;byte[], Long&gt; getOutputCounts() {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      return null; // only used in tests<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>    @Override<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    public int getNumberOfRecoveredRegions() {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      return 0;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>    AtomicLong getSkippedEditsCounter() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      return skippedEdits;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>    /**<a name="line.348"></a>
+<span class="sourceLineNo">349</span>     * returns true if the specified entry must be replicated.<a name="line.349"></a>
+<span class="sourceLineNo">350</span>     * We should always replicate meta operations (e.g. flush)<a name="line.350"></a>
+<span class="sourceLineNo">351</span>     * and use the user HTD flag to decide whether or not replicate the memstore.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>     */<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    private boolean requiresReplication(final TableName tableName, final List&lt;Entry&gt; entries)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        throws IOException {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      // unit-tests may not the TableDescriptors, bypass the check and always replicate<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      if (tableDescriptors == null) return true;<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>      Boolean requiresReplication = memstoreReplicationEnabled.getIfPresent(tableName);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      if (requiresReplication == null) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        // check if the table requires memstore replication<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        // some unit-test drop the table, so we should do a bypass check and always replicate.<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        TableDescriptor htd = tableDescriptors.get(tableName);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        requiresReplication = htd == null || htd.hasRegionMemStoreReplication();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        memstoreReplicationEnabled.put(tableName, requiresReplication);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>      // if memstore replication is not required, check the entries.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // meta edits (e.g. flush) must be always replicated.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      if (!requiresReplication) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        int skipEdits = 0;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        java.util.Iterator&lt;Entry&gt; it = entries.iterator();<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        while (it.hasNext()) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          Entry entry = it.next();<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          if (entry.getEdit().isMetaEdit()) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>            requiresReplication = true;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          } else {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            it.remove();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            skipEdits++;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>          }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        }<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        skippedEdits.addAndGet(skipEdits);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      }<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      return requiresReplication;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  static class RegionReplicaSinkWriter extends SinkWriter {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    RegionReplicaOutputSink sink;<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    ClusterConnection connection;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    RpcControllerFactory rpcControllerFactory;<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    RpcRetryingCallerFactory rpcRetryingCallerFactory;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    int operationTimeout;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    ExecutorService pool;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    Cache&lt;TableName, Boolean&gt; disabledAndDroppedTables;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    TableDescriptors tableDescriptors;<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    public RegionReplicaSinkWriter(RegionReplicaOutputSink sink, ClusterConnection connection,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        ExecutorService pool, int operationTimeout, TableDescriptors tableDescriptors) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      this.sink = sink;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      this.connection = connection;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      this.operationTimeout = operationTimeout;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      this.rpcRetryingCallerFactory<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        = RpcRetryingCallerFactory.instantiate(connection.getConfiguration());<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      this.rpcControllerFactory = RpcControllerFactory.instantiate(connection.getConfiguration());<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      this.pool = pool;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      this.tableDescriptors = tableDescriptors;<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      int nonExistentTableCacheExpiryMs = connection.getConfiguration()<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        .getInt("hbase.region.replica.replication.cache.disabledAndDroppedTables.expiryMs", 5000);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // A cache for non existing tables that have a default expiry of 5 sec. This means that if the<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      // table is created again with the same name, we might miss to replicate for that amount of<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      // time. But this cache prevents overloading meta requests for every edit from a deleted file.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      disabledAndDroppedTables = CacheBuilder.newBuilder()<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        .expireAfterWrite(nonExistentTableCacheExpiryMs, TimeUnit.MILLISECONDS)<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        .initialCapacity(10)<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        .maximumSize(1000)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        .build();<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>    public void append(TableName tableName, byte[] encodedRegionName, byte[] row,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        List&lt;Entry&gt; entries) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>      if (disabledAndDroppedTables.getIfPresent(tableName) != null) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        if (LOG.isTraceEnabled()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          LOG.trace("Skipping " + entries.size() + " entries because table " + tableName<a name="line.425"></a>
+<span class="sourceLineNo">426</span>            + " is cached as a disabled or dropped table");<a name="line.426"></a>
+<span class="sourceLineNo">427</span>          for (Entry entry : entries) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            LOG.trace("Skipping : " + entry);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        sink.getSkippedEditsCounter().addAndGet(entries.size());<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>      // If the table is disabled or dropped, we should not replay the entries, and we can skip<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      // replaying them. However, we might not know whether the table is disabled until we<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      // invalidate the cache and check from meta<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      RegionLocations locations = null;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      boolean useCache = true;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      while (true) {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        // get the replicas of the primary region<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        try {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          locations = RegionReplicaReplayCallable<a name="line.443"></a>
+<span class="sourceLineNo">444</span>              .getRegionLocations(connection, tableName, row, useCache, 0);<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>          if (locations == null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>

<TRUNCATED>